2011-07-31 6 views
5

私は、ASP.NETでページクラスを拡張していくつかの新しい機能(いくつかのメソッドがそのコードのコード内で直接呼び出されるため使いやすい)を追加しようとしています。私はbase.SetQueryを入力した場合継承に関する奇妙な拡張メソッドの問題

は私のメソッドが SetQuery呼ばれる

、私はPageクラスにSetQueryを入力すると、それが認識されない
(はい、私はusing [Namespace];を追加しました)、
それは見ている:mは奇妙なエラーを取得しますIntelliSenseでは、私はを入力した場合、メソッドや拡張メソッドがページに実際に見つからないと言ってコンパイルしません。
0それは認識され、動作します。

特に、2番目のケースはIntelliSenseが拡張メソッドとして認識しているものの、コンパイルされていないため、バグであるようです。

キャストなどを使わずに、SetQueryとタイプするのはもっと自然な方法ですか?

答えて

9

拡張メソッド常には(明示的な)対象オブジェクトを必要とするため、TheMethodName()を介して拡張メソッドを呼び出すことはできません。私はあなたがタイプすればそれが疑わしい:

this.SetQuery(); 

それは働くでしょう。 はありませんです。暗黙的にはthis.の拡張メソッドがあります。奇妙だが真実。

上記はなぜSetQuery()が機能しないかを説明しています。拡張メソッドがPageに定義されているため、base.SetQuery()は機能しません。ベースクラスでは定義されていません。限り実際ページがないと(同じILを生成する必要がありますthis.SetQuery()(this as Page).SetQuery()すなわち - (this as Page).SetQuery()this.SetQuery()と同じ理由のために働くだろう、とthis as Pageは明らかに真であるため、実際には、コンパイラはノーオペレーションとしてあることを扱います明らかにより具体的なSetQuery()メソッドを持っている)。

+0

私は拡張メソッドをかなり使用していましたが、私はそのクラス自体の中でそれらを呼び出すことはなかったと思います。しかし、Intellisenseがその方法を示しているのはまだ私にはバグかもしれませんが、Intellisenseから書いたときにはコンパイルされません。 –

+0

@はい、それはintellisenseバグのように傷ついています - 同意しました –

+0

FYI:それはC#のみです。 VBでは暗黙のthisを使用することができます。 –