2011-07-31 56 views
5

我想擴展頁面類來添加一些新功能(易於使用的一些方法,因爲它們將直接在該頁面的代碼中調用),我' m如果一個奇怪的錯誤:奇怪的擴展方法問題與繼承

我的方法被稱爲SetQuery
如果我在一個頁面類類型SetQuery,它不承認(是的,我已經添加using [Namespace];),
如果我鍵入base.SetQuery可以看出在智能感知,但不編譯說,如果我輸入頁實際上找不到任何方法或擴展方法在
0它被認可並且有效。

尤其是第二種情況對我來說似乎是一個錯誤,因爲IntelliSense將其識別爲擴展方法,但沒有編譯。

有沒有更自然的方式來鍵入SetQuery,因爲我去,沒有轉換等?

回答

9

擴展方法總是需要一個(顯式的)目標對象,因此無法通過TheMethodName()調用擴展方法。我懷疑如果你輸入:

this.SetQuery(); 

它會工作。有從不暗含this.與擴展方法。奇怪但真實。

以上解釋了爲什麼SetQuery()不起作用; base.SetQuery()將不起作用,因爲擴展方法定義爲Page,而不是基類。 (this as Page).SetQuery()將同樣的原因上班this.SetQuery(),而實際上因爲this as Page顯然是真的,編譯器將可以把它看成一個無操作 - 即this.SetQuery()(this as Page).SetQuery()應該產生相同的IL(只要實際頁面不有一個更具體的SetQuery()方法,顯然)。

+0

我明白了,我想即使我一直在使用擴展方法,但我從來沒有在這個類中自己調用它們。但對我來說,intellisense顯示該方法似乎仍然是一個錯誤,但是當我從intellisense編寫/選擇該方法時,它不編譯,抱怨找不到它。 –

+0

@can yes,那個傷口像intellisense bug一樣 - 同意 –

+0

僅供參考:這隻適用於C#。在VB中,你可以使用一個隱含的。 –