[C#]依頼とメソッドグループ

1341 ワード

依頼関連コード、特に汎用依頼関連コードを作成する場合、次のような問題が発生することがよくあります.
委任タイプを定義します.
public delegate void TestDelegate<T>(T arg);

テスト用のクラスとメソッドを定義します.
public class TestClass
{
    public void TestFunc4Delegate(int arg){}
    public void TestFunc1(Delegate dele){}
    public void TestFunc2<T>(TestDelegate<T> dele){}
}

テスト用のコード:
1.    TestClass tc = new TestClass();
2.    tc.TestFunc1(tc.TestFunc4Delegate);
3.    tc.TestFunc2(tc.TestFunc4Delegate);

すると、上記のテスト用コードにコンパイルエラーがあり、2行目のコンパイルエラーは「メソッドグループからSystem.Delegateに変換できない」、3行目のコンパイルエラーは「TestClass.TestFunc 2(TestDelegate)のタイプ実パラメータを使用法から導出できない」であることがわかります.
以上のエラーの核心問題は「メソッドグループ」にあります.「メソッドグループ」はコンパイラの概念で、C#はメソッドのリロードをサポートするため、同じ名前のメソッドには複数のリロード実装方式がある可能性があります.このすべての名前の同じリロードメソッドが結合すると、メソッドグループになります.上記の例ではtc.TestFunc 4 Delegateは実際にはTest 4 Delegateというメソッドグループを指していますが、上記のクラス定義ではTest 4 Delegateをリロードしていませんが、メソッドグループです.
メソッドグループである以上、問題は発生します.必要なのは、メソッドグループのどのリロードなのか分かりません.確定できないだけに,コンパイラはどの依頼サブタイプで依頼インスタンスを作成するかを決定することができず,同様に汎用型の正確なタイプを導出することができない.
前例の呼び出しをコンパイルできるようにするには、次のように限定タイプを指定する必要があります.
tc.TestFunc1((TestDelegate<int>)tc.TestFunc4Delegate);
tc.TestFunc2<int>(tc.Test4Delegate);