gpt4 book ai didi

c# - 具有可空参数调用具体类型的泛型重载方法

转载 作者:太空宇宙 更新时间:2023-11-03 14:06:30 25 4
gpt4 key购买 nike

我希望能够调用具有 Nullable 参数的通用 foo 方法。当 Foo 方法的主体调用 Foo() 时,它会递归,导致堆栈溢出(没有 .com)。有没有办法让 if 语句中的调用使用运行时类型调用正确的重载?

我知道更改名称就可以了,我明白为什么会发生递归,但不知道还有什么其他的写法。

感谢您的关注。

class Program {
static void Main(string[] args) {
int? x = 5;
int y = 10;
Foo(x, y);
}

static void Foo<T>(Nullable<T> arg, T defaultValue) where T : struct {
if (arg.HasValue)
Foo(arg.Value, defaultValue);
}

static void Foo(int arg, int defaultValue) {
Console.WriteLine(string.Format("I'm an int arg={0}, default={1]}", arg, defaultValue));
}

static void Foo(string arg, int defaultValue) {
Console.WriteLine(string.Format("I'm an string arg={0}, default={1]}", arg, defaultValue));
}

static void Foo(bool arg, int defaultValue) {
Console.WriteLine(string.Format("I'm an double arg={0}, default={1]}", arg, defaultValue));
}
}

最佳答案

泛型是一种编译时特性,在程序运行之前就已经确定了重载决议。如您所说,如果您想强制执行运行时决策,您可以使用 dynamic 来实现该目标(在 C# 4+ 中)。除此之外,您只需转换为 int 和 bool 之间的适用类型即可。

  if (arg.HasValue) 
Foo((dynamic)arg.Value, defaultValue);

但是要小心!这只解决了 intbool 的问题。其他类型可以传递给泛型方法,这些类型将在后续调用中继续解析为泛型方法。

 Foo(5.0, 10.0); // would still overflow with your given methods

按照您最初的判断,如果您想支持intstringbool,只需进行这些重载即可。如果您想支持任何给定的 T,请为 T 创建一个重载。

static void Foo<T>(T arg, T defaultValue)
{
Console.WriteLine(string.Format("I'm a T arg={0}, default={1}", arg, defaultValue));
}

重载解析仍会选择 intboolstringT? 重载(如果适用) 基于编译时信息。所有其他调用,使用arg.Value 的调用,都将转到这个新的重载。

关于c# - 具有可空参数调用具体类型的泛型重载方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9170758/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com