2010-11-18 137 views
0

如果你想創建一個空的IEnumerable T類型的,你可以使用靜態泛型方法爲什麼它IEnumerable.Empty <T>()而不是IEnumerable <T> .Empty()?

Enumerable.Empty<T>() 

更多信息,請參見here創建它。

爲什麼微軟會選擇這個選項,而不是在泛型類型上使用靜態方法(與非泛型類型上的泛型靜態方法相反)?

該方法可用於這樣的:

Enumerable<T>.Empty() 

這將然後返回一個空IEnumerable<T>

在我看來,第二種選擇更有意義,因爲我想創建的是通用IEnumerable<T>,而不是非通用IEnumerable

編輯:錯字

+0

這是'Enumerable.Empty ''不IEnumerable.Empty ' – spender 2010-11-18 16:47:43

+0

僅供參考你的意思Enumerable.Empty 不IEnumerable.Empty ,你不能有一個接口上的靜態。 – 2010-11-18 16:48:03

+0

是的,只要我發佈我的問題,我意識到,原因是因爲你顯然不能有一個接口上的靜態方法..此外,Enumerable 不存在。 – GuiSim 2010-11-18 16:56:50

回答

12

IEnumerable<T>是一個接口。
接口不能包含靜態成員。

靜態方法實際上是Enumerable類型,它是非通用的static類。
因此,沒有Enumerable<T>泛型類可以包含該方法。

Static members on generic types should be avoided
擴展方法不能將置於通用類型中。
這就是爲什麼靜態Enumerable類不是通用的。

+0

爲什麼這會降低投票率? – SLaks 2010-11-18 17:01:51

+0

閱讀msdn頁面,我不知道爲什麼靜態成員泛型類型是邪惡的。 – GuiSim 2010-11-18 18:30:35

+0

@Gui:他們不是邪惡的;他們只是混淆。 – SLaks 2010-11-18 18:37:43

3

存在一個名爲Enumerable的靜態類,其上定義了此方法。沒有一個稱爲Enumerable<T>的靜態類。這是因爲EnumerableIEnumerable<T>上定義了擴展方法(所有這些方法都有一個通用參數T),並且擴展方法不能存在於泛型類中。這就是爲什麼Empty<T>是這樣定義的。

從規範的§10.6.9:

擴展方法只能在非泛型,非嵌套靜態類中聲明。

相關問題