2

ネイティブ メソッドと同じシグネチャを持つ拡張メソッド (EM) を作成するとどうなりますか。

私のシナリオ
拡張メソッドを作成しました

public static class EM
{
    public static void ForEach<T>(this List<T> enu, Action<T> action)
    {            
        foreach (T item in enu)
            action(item);
    }
}

List にも同じシグネチャの関数があるため

public void ForEach(Action<T> action);

リストのために私がした

List<Label> re = new List<Label>();
re.ForEach(x => Foo(x));

これはコンパイルして実行しますが、EM を呼び出さず、代わりにそのネイティブ メソッドを呼び出します。オーバーロードするには署名に何らかの変更が必要であるため、2つのオーバーロードがあることは表示されないと確信しています

ここに画像の説明を入力

クエリ
Q1. なぜこうなった?
Q2. さらにパラメーターがあれば、パラメーターの順序を変更して呼び出すことができました。しかし、どうすれば彼に私の EM を同じ数のパラメーターで呼び出させることができるでしょうか (これは私の問題の非常に簡単な説明です。私の EM は複雑なものだった可能性があります)。

4

1 に答える 1

4

C# は、拡張メソッドを呼び出す代わりに、常にクラスのメソッドを呼び出します。メソッドの名前に何かを追加して、それを区別することをお勧めします。個人的には最後に Ex を使っていますが、これは短くて拡張メソッドであることを思い出させてくれます。

public static class EM
{
    public static void ForEachEx<T>(this List<T> enu, Action<T> action)
    {            
        foreach (T item in enu)
            action(item);
    }
}
于 2012-09-18T11:37:18.353 に答える