2013-07-23 41 views
3

爲什麼在一個不是靜態的類中聲明/實現擴展方法是不可能的?在非靜態泛型類中沒有擴展方法?

我知道擴展方法是用於不可實例化類型的。但爲什麼不在可實例化的類中實現呢?這是什麼原因?這是技術問題,還是僅僅爲了更快地找到方法或強制更好的軟件設計?

+0

可能的重複[爲什麼不支持C#靜態類擴展方法?](http://stackoverflow.com/questions/4909156/why-arent-c-sharp-static-class-extension-methods-supported) –

+0

重複的http://stackoverflow.com/questions/3930335/why-are-extension-methods-only-allowed-in-non-nested-non-generic-static-class –

回答

1

您可以定義一個類,靜態的,如果你想保證它 不能被實例化,不能獲得或作爲基地 另一種類型,並且只能包含靜態成員。

http://msdn.microsoft.com/en-us/library/vstudio/79b3xss3.aspx

有擴展方法是編輯:靜new'd在子類和這樣將是一個真正的痛苦。

如同所有類類型的情況下,用於靜態 類的類型信息由.NET Framework公共語言運行庫(CLR) 當加載引用類的程序裝載。

靜態類在初始化優先級鏈上更高,使實現更高效。

+1

我會假設,靜態類,擴展方法本身仍然需要「靜態」,因此無論如何你都無法覆蓋它們。 –

+0

@ChrisSinclair - 我的意思是新的修飾符http://msdn.microsoft.com/en-us/library/51y09td4%28v=vs.71%29.aspx#vclrfnew_newmodifier –

+0

同樣的區別。靜態方法屬於它們聲明的類型。當在類(或其派生子類)內部調用靜態方法而沒有明確指示類型時,使用'new'隱藏靜態方法僅具有效果。除非你建議如果你在命名空間'A'上聲明瞭基類'Bar'的擴展方法,在名稱空間'B'中聲明瞭一個派生類'Foo:Bar',然後添加'使用B;'來導入擴展方法從'B.Foo',它會抓取並從'A.Bar'抓取擴展方法呢? **害怕** –

0

LINQ只需要靜態,非泛型,非嵌套類中的擴展方法來工作,這就是它的設計和實現方式。如果它需要非靜態的,通用的嵌套類,它將以這種方式實現。