我有两个重载的泛型方法:
T Foo<T>(T t) { Console.WriteLine("T"); return t; }
T Foo<T>(int i) { Console.WriteLine("int"); return default(T); }
当我在我的电脑上尝试调用以下代码时:
Foo
Foo(5);
我没有收到编译器错误或警告,而且使用泛型参数的第一个方法被调用了(即输出结果为T
)。在所有C#版本和平台上都会是这种情况吗?如果是,为什么?
另一方面,如果我在泛型调用中明确指定类型:
Foo<int>(5);
调用带有int
参数的第二种方法,即输出现在为int
。 为什么?
我在我的两个方法重载中使用不同的参数名称,因此以下调用的输出结果如预期:
Foo<int>(t: 5); // output 'T'
Foo<int>(i: 5); // output 'int'
如果我调用第一个方法,甚至可以省略类型说明:
Foo(t: 5); // output 'T'
但是如果我尝试编译这个代码:
Foo(i: 5);
我遇到了一个错误:方法“Foo(int)”的类型参数无法从使用中推断出。尝试显式指定类型参数。为什么编译器不能处理这个调用?
注意:这些测试是在Windows 8 x64系统上使用LinqPad执行的(如果与结果相关...)
int Foo(int i)
,那么 这个 方法将被Foo(5)
调用。为什么当我创建具有相同参数签名的泛型方法时,这不再成立呢? - Anders Gustafsson