[英]Why do LINQ methods have an optional type
許多LINQ方法采取以下形式
MethodName<Type>();
似乎在調用這些方法時, Type
是可選的。 例如,以下兩個語句似乎產生相同的結果:
var a = someStringList.First<string>();
var b = someStringList.First();
為什么要輸入該語句的<string>
部分? 它在某些情況下具有實用性嗎?
首先,請注意,這適用於任何通用方法,而不僅限於LINQ方法。
通常,您不需要在通用方法上指定類型,因為通常可以從用法中推斷出類型。 例如:
T SomeFunc<T>(T arg) {....}
var x = SomeFunc("Hello World");
由於我們使用字符串作為參數,因此編譯器確定T
為字符串,因此我們得出結論,該方法將返回字符串。
在其他時候,它不能推斷出:
T SomeOtherFunc<T>(string arg) {....}
var x = SomeOtherFunc("Hello World"); // error : cannot infer type
在這種情況下,您必須指定類型:
var x = SomeOtherFunc<int>("Hello World"); // x will be an int.
如果您確實想(例如,為了更加清楚起見),則可以指定類型,即使可以推斷出該類型,但它必須是正確的:
T SomeFunc<T>(T arg) {....}
var x = SomeFunc<string>("Hello World"); // OK
var y = SomeFunc<int>("Hello World"); // Error
最后,請記住,對於擴展方法(例如您的示例中的First<>
,對象實際上是第一個參數,因此可以在類型推斷中使用。 First<>
將定義為:
public static T First<T>(this IEnumerable<T> coll) ;
因為在第二種類型中,編譯器會根據someStringList
的類型自動推斷出類型,因為它是IEnumerable<string>
編譯器會將通用參數類型解析為string
。
好的,所以聽起來好像可以在需要時進行投放...為什么不使用.Cast?
由於Cast
方法將非通用IEnumerable
作為其第一個參數,因此無法推斷類型,這就是為什么需要提供它。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.