为什么LINQ方法具有可选类型

Mik*_*keH 0 c# linq

许多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>声明的部分?有没有实用性的情况?

Jam*_*ran 6

首先,请注意,这适用于任何泛型方法,而不仅仅是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)