簡體   English   中英

為什么LINQ方法具有可選類型

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM