许多LINQ方法采用的形式
MethodName<Type>();
Run Code Online (Sandbox Code Playgroud)
看来,在调用这些方法时,它Type是可选的.例如,这两个语句似乎产生相同的结果:
var a = someStringList.First<string>();
var b = someStringList.First();
Run Code Online (Sandbox Code Playgroud)
为什么我要输出该<string>声明的部分?有没有实用性的情况?
首先,请注意,这适用于任何泛型方法,而不仅仅是LINQ方法.
通常,您不需要在泛型方法上指定类型,因为通常可以从使用中推断出类型.例如:
T SomeFunc<T>(T arg) {....}
var x = SomeFunc("Hello World");
Run Code Online (Sandbox Code Playgroud)
由于我们使用了一个字符串作为参数,编译器决定它T是一个字符串,因此我们得出结论,该方法将返回一个字符串.
其他时候,它不能推断它:
T SomeOtherFunc<T>(string arg) {....}
var x = SomeOtherFunc("Hello World"); // error : cannot infer type
Run Code Online (Sandbox Code Playgroud)
在这种情况下,您必须指定类型:
var x = SomeOtherFunc<int>("Hello World"); // x will be an int.
Run Code Online (Sandbox Code Playgroud)
如果你真的想要,为了更加清晰,你可以指定类型,即使它可以被推断,但它必须是正确的:
T SomeFunc<T>(T arg) {....}
var x = SomeFunc<string>("Hello World"); // OK
var y = SomeFunc<int>("Hello World"); // Error
Run Code Online (Sandbox Code Playgroud)
最后,请记住,对于扩展方法,如First<>在您的示例中,该对象实际上是第一个参数,因此可以在类型推断中使用. First<>将被定义为:
public static T First<T>(this IEnumerable<T> coll) ;
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
61 次 |
| 最近记录: |