許多LINQ方法採取的爲什麼LINQ方法有一個可選的類型
MethodName<Type>();
形式看來,調用這些方法時,Type
是可選的。例如,這兩個說法似乎產生相同的結果:
var a = someStringList.First<string>();
var b = someStringList.First();
我爲什麼要鍵入了該聲明的<string>
部分?有沒有案件有效用?
許多LINQ方法採取的爲什麼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
,因爲它是第一個參數,所以沒有辦法來推斷的類型,這就是爲什麼你需要爲它提供。
啊,這很有道理。謝謝。 – MikeH 2014-11-20 23:21:45