27

私は次のようなコードを持っています

public class TestA
{
    public string ColA { get; set; }
    public string ColB { get; set; }
    public string ColC { get; set; }
    public void MethodA()
    {
        MessageBox.Show("Original A1.");
    }
}

static class ExtenstionTest
{
  
    public static void MethodA(this TestA A1)
    {
        MessageBox.Show("Extended A1.");
    }
}

今、私がMethodAを次のように呼び出すと

TestA a = new TestA();
        a.MethodA();

常にOriginalメソッドを呼び出します。拡張メソッドを呼び出すにはどうすればよいですか。

4

5 に答える 5

41

通常の拡張メソッドとして拡張メソッドを呼び出すことはできません。インスタンスメソッドは、同じシグネチャで拡張メソッドをオーバーライドします

編集:

静的メソッドとして呼び出すことができます

ExtensionTest.MethodA(a);
于 2012-11-23T06:57:44.210 に答える
18

拡張メソッドとして呼び出すことはできません。拡張メソッドであるという点では、現時点では基本的に役に立たない。(個人的にはこれを警告にしたいと思いますが、気にしないでください。)

コンパイラは、拡張メソッドを解決しようとする前に、考えられるすべてのインスタンスメソッドを試行します。C#4仕様のセクション7.6.5.2から:

いずれかの形式のメソッド呼び出し[...]呼び出しの通常の処理で適用可能なメソッドが見つからない場合、拡張メソッド呼び出しとして構成を処理しようとします。

以降:

前述のルールは、インスタンスメソッドが拡張メソッドよりも優先されることを意味します

ただし、通常の静的メソッドのように呼び出すことができます。

// Fixed typo in name
ExtensionTest.MethodA(a);
于 2012-11-23T06:59:25.103 に答える
8

拡張メソッド-MSDN

インターフェイスまたはクラスメソッドと同じ名前とシグネチャを持つ拡張メソッドが呼び出されることはありません。コンパイル時には、 拡張メソッドは、型自体で定義されたインスタンスメソッドよりも常に優先度が低くなります。

拡張メソッドは、クラスの通常の静的メソッドとして呼び出すことができます。

ExtenstionTest.MethodA(a);

MSDNから

つまり、型にProcess(int i)という名前のメソッドがあり、同じシグネチャを持つ拡張メソッドがある場合、コンパイラは常にインスタンスメソッドにバインドします。コンパイラがメソッド呼び出しを検出すると、最初に型のインスタンスメソッドで一致するものを探します。一致するものが見つからない場合は、タイプに対して定義されている拡張メソッドを検索し、最初に見つかった拡張メソッドにバインドします。次の例は、コンパイラがバインドする拡張メソッドまたはインスタンスメソッドを決定する方法を示しています。

于 2012-11-23T06:59:17.577 に答える
3

拡張メソッドは、他の静的メソッドと同じように呼び出すことができます。

ExtenstionTest.MethodA(a);
于 2012-11-23T06:58:36.707 に答える
0

他の人が示唆したように、このメソッドを呼び出すことはできません。それを呼び出す唯一の方法は次のとおりです。

TestA a = new TestA();
ExtenstionTest.MethodA(a);
于 2012-11-23T07:07:37.937 に答える