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
它的工作原理是因为a和b是整数,所以编译器可以推断通用类型参数What.
在C#3中,只要扩展转换有意义,编译器也可以推断类型参数,即使类型不匹配也是如此.例如,如果c是a long,那么What(a, c)将被解释为What<long>.
请注意,如果c是string,那么它就不起作用了.
C#编译器支持泛型的类型推断,如果使用var关键字,也常见.
这int是从上下文(a和b)中推断出来的,因此<int>不需要.它使代码更清晰,有时更容易阅读.
如果您让编译器推断出类型,有时您的代码可能会更清晰,有时如果您明确指定类型可能会更清楚.这是对你的特定情况的判断.
它使用通用方法的类型推断.请注意,这在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节.
编译器根据您传递的实际参数的类型推断泛型类型参数.
此功能使LINQ调用更加简单.(你不需要写numbers.Select<int, string>(i => i.ToString()),因为编译器推断出intfrom numbers和stringfrom ToString)
| 归档时间: |
|
| 查看次数: |
505 次 |
| 最近记录: |