5

初めて拡張メソッドを作成しようとしていますが、問題が発生しています...多分あなたたちが助けてくれるでしょう:)

public static class Extentions
    {
        public static int myMethod(this MyClass c)
        {
              return 1;
        }
    }

次に、「MyClass.myMethod」を実行すると、メソッドが存在しないというqコンパイラエラーが発生します...

何故ですか?

4

4 に答える 4

19

まず、拡張メソッドを持つクラスを含む名前空間を含めるための "using" ディレクティブが必要です。

2番目-「MyClass.myMethod」-拡張メソッドは静的ではなくインスタンスで機能するため、次のものが必要です。

MyClass foo = ...
int i = foo.myMethod(); // translates as: int i = Extentions.myMethod(foo);

最後に、拡張メソッドを内部 MyClass(またはサブクラス) で使用する場合は、明示的なものが必要ですthis

int i = this.myMethod(); // translates as: int i = Extentions.myMethod(this);

これは、重要な数少ないケースの 1 つですthis

于 2009-03-12T12:51:26.337 に答える
6

拡張機能が定義されている名前空間を含めましたか? 私は以前それで火傷を負ったことがあります。

そして、拡張機能がその名前空間で拡張機能を定義する名前空間を追加する必要を回避する方法。これは良い習慣ではありませんが

于 2009-03-12T12:47:44.367 に答える
5

クラスがusing存在する名前空間を (先頭の句)インポートしましたか?Extensions

using Myself.MyProduct.MyNamespace;
于 2009-03-12T12:49:11.867 に答える
1

拡張メソッドの使用を強制する理由はありますか?

元のソースにメソッドを追加できず、サブクラスでクラスを拡張できない場合にのみ、拡張メソッドを使用する必要があります (宣言されている場合sealed) 。

拡張メソッドのページには次のように記載されています。

一般に、拡張メソッドは控えめに実装し、必要な場合にのみ実装することをお勧めします。既存の型を拡張する必要があるクライアント コードは、可能な限り、既存の型から派生した新しい型を作成して拡張する必要があります。詳細については、「継承 (C# プログラミング ガイド)」を参照してください。

ここには、クラスポリモーフィズムに関するさらに詳しい情報があります。

usingクラスを拡張することが実際に不可能な場合は、ディレクティブおよびインスタンスメソッド静的メソッドに関する他の回答に従ってください。

于 2009-03-12T13:34:12.040 に答える