因爲我已經延遲了類型的定義直到編譯時間,intellisense(以及其他涉及到的)如何知道我正在擴展的類型? C#是否默認爲頂層System.Object?
那些說這是System.Object
的延伸是錯誤的。首先,這種方法不會將值類型輸入框,但在System.Object
上定義的擴展方法將會。
你定義的擴展方法是一般參數擴展方法。它可以應用於任何類型爲的有效的通用類型參數。
如果你沒有考慮過以下列方式擴展方法,這可能會幫助你瞭解他們更好一點。擴展方法只是語言規範讓我們逃避的一個技巧。擴展方法實際上只是靜態類中的靜態方法,我們可以將它們稱爲實例方法。所以
static class Foo {
public static void M(this object obj) { }
}
只是靜態類中的靜態方法。你可以這樣調用它:
Foo.M(obj);
,但我們可以把它喜歡它是一個實例方法:
obj.M();
因此,當你有一個通用的擴展方法,停了一分鐘,想想作爲一個靜態類的靜態方法
static class Foo {
public static void M<T>(this T obj) { }
}
你可以這樣調用它:
object obj;
Foo.M(obj);
,或者你可以這樣調用:
obj.M();
有到你寫的編譯器沒有區別。
所以,現在你想它作爲一種常規的泛型方法。但是當你從這個角度思考它時,你明白編譯器會讓你在任何有效的泛型類型參數類型上調用這個方法。因此,你現在明白了爲什麼它可以被認爲是任何有效的泛型類型參數的擴展方法。
這是什麼都與LINQ呢? – BoltClock 2012-04-04 15:33:08
@ BoltClock'saUnicorn linq中的流暢sytnax基於擴展方法。 – 2012-04-04 15:48:35
@RoyiNamir LINQ基於擴展方法的事實並不會使所有與LINQ相關的擴展方法相關。 – Servy 2012-04-04 15:50:15