2014-11-20 55 views
0

許多LINQ方法採取的爲什麼LINQ方法有一個可選的類型

MethodName<Type>(); 

形式看來,調用這些方法時,Type是可選的。例如,這兩個說法似乎產生相同的結果:

var a = someStringList.First<string>(); 
var b = someStringList.First(); 

我爲什麼要鍵入了該聲明的<string>部分?有沒有案件有效用?

回答

6

首先,請注意,這適用於任何通用方法,而不僅僅是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) ; 
+0

啊,這很有道理。謝謝。 – MikeH 2014-11-20 23:21:45

4

因爲第二種類型是由編譯器根據someStringList的類型自動推斷的。由於它是IEnumerable<string>編譯器將通用參數類型解析爲string

好的,所以它聽起來像它可以用來施放如果需要......爲什麼不使用.Cast?

因爲Cast方法採用非通用IEnumerable,因爲它是第一個參數,所以沒有辦法來推斷的類型,這就是爲什麼你需要爲它提供。

+0

好了,這聽起來像它可以被使用,如果需要投...爲什麼不使用'.Cast '? – MikeH 2014-11-20 23:13:02

+0

如果您明確指定了類型,則必須匹配要傳入的參數的實際類型。沒有投射。 – Cameron 2014-11-20 23:17:43

相關問題