为什么这样做?

Fiz*_*izz 10 .net c# generics type-inference

为什么这样做?我不是在抱怨,只是想知道.

void Test()
{    
    int a = 1;
    int b = 2;

    What<int>(a, b);
    // Why does this next line work?
    What(a, b);
}

void What<T>(T a, T b)
{

}
Run Code Online (Sandbox Code Playgroud)

Dan*_*Tao 18

它的工作原理是因为ab是整数,所以编译器可以推断通用类型参数What.

在C#3中,只要扩展转换有意义,编译器也可以推断类型参数,即使类型不匹配也是如此.例如,如果c是a long,那么What(a, c)将被解释为What<long>.

请注意,如果cstring,那么它就不起作用了.


Bri*_*ndy 7

C#编译器支持泛型的类型推断,如果使用var关键字,也常见.

int是从上下文(ab)中推断出来的,因此<int>不需要.它使代码更清晰,有时更容易阅读.

如果您让编译器推断出类型,有时您的代码可能会更清晰,有时如果您明确指定类型可能会更清楚.这是对你的特定情况的判断.

  • @SLaks:是的,我知道. (2认同)

Jon*_*eet 7

它使用通用方法的类型推断.请注意,这在C#2和3之间已经发生了变化.例如,这在C#2中不起作用:

What("hello", new object());
Run Code Online (Sandbox Code Playgroud)

......而它会在C#3(或4)中.在C#2中,类型推断是基于每个参数执行的,结果必须完全匹配.在C#3中,每个参数都提供信息,然后将这些信息放在一起以推断类型参数.C#3还支持多阶段类型推断,其中编译器可以计算出一个类型参数,然后查看它是否有关于其余参数的更多信息(例如,由于具有隐式参数类型的lambda表达式).基本上它一直持续到它无法获得更多信息,或者它完成 - 或者它看到相互矛盾的信息.C#中的类型推断并不像Hindley-Milner算法那样强大,但它在其他方面效果更好(特别是它总能推进进步).

有关详细信息,请参阅C#3规范的第7.4.2节.


SLa*_*aks 5

编译器根据您传递的实际参数的类型推断泛型类型参数.

此功能使LINQ调用更加简单.(你不需要写numbers.Select<int, string>(i => i.ToString()),因为编译器推断出intfrom numbersstringfrom ToString)