2016-11-21 2 views
2

別のメソッドのパラメータとして変数のパラメータを持つメソッドを渡します。しかし、運がない。
私は何か行動を渡すことができます。しかし、方法。
助けが必要ですか?C#の:私はFooのメソッドへのランダムシグネチャを持つメソッドを渡すためにしようとしているので、ここで

class Bar 
{ 
    void M1(int a) { } 
    void M2(string a, int b) { } 

    Action<string, int, bool> A1 = (s, i, b) => {}; 
    Action<int, float> A2 = (i, f) => {}; 

    void Foo(Delegate f) {} 

    void Test() 
    { 
     Foo(A1); 
     Foo(A2); 
     // Foo(M1); // nope 
     // Foo(M2); // no way 
    } 
} 

PS。 Unity3dのMonoの下でこれを動作させようとしています。あなたはこのように、それを行うために、具体的なデリゲート型にキャストする必要が

+1

これはそれだけで言語の一部だ、unity3dする特定またはモノではありません。 「M1」と「M2」は委任されていない「方法群」である。メソッドグループは互換性のあるデリゲート型に変換でき、コンパイラは(ActionやFuncのように)空中から1つを選択することを拒否します。 –

+0

ええ、私は知っています。 C#3.0 +のユニークな機能に基づいてソリューションを提案した人のために、私はそれを述べました。 – dotsquid

答えて

4

void Test() 
{ 
    Foo(A1); 
    Foo(A2); 
    Foo((Action<int>) M1); 
    Foo((Action<string, int>)M2); 
} 

この理由はM1M2では、メソッド・グループと呼ばれるものです。それは、1つ以上のメソッドを参照することを意味します。なぜそれは複数のことができますか? M1という名前のメソッドが複数ある可能性があるため、それぞれ異なる引数セットを受け入れます。しかし、あなただけの1つの過負荷を持っている場合でも、あなたのケースのように、(それがAction<int>またはYourDelegateTypeデリゲートのボイドYourDelegateType(int型引数)として宣言されているか、あるいは何でもあるかもしれない)が過負荷署名と互換性のある複数のデリゲートの型があるかもしれません。

したがって、メソッドグループからデリゲートへの暗黙的な変換はなく、メソッドグループを特定のデリゲートタイプに明示的にキャストする必要があります。

+0

一つのことは、複数の過負荷が存在する可能性があることです。しかし、この場合、「M1」と「M2」という名前のそれぞれには、過負荷が1つしかありません。もう1つのことは、複数の互換コンクリートデリゲート型が存在する可能性があることです。たとえば、 'Foo(M3);'は 'Foo((Action )M3);または' Foo Foo((EventHandler )M3); '。あるいは 'Foo((MyDel)M3);' MyDelは自分で作成するタイプです。 'アクション<,>コンパイラは「無から」'アクション<,> 'を取得しませんので、'、C#で特別な地位を持っていません。コとcontravarianceは、メソッドグループの変換を可能にしているので、 –

+1

はまた、あなたは時々型パラメータの別のセットを使用することができます。以前から私の例を続けると、両方 'Fooの((アクション)M3);'と 'Fooの((アクション)M3);'可能です。 –

+0

確かに良い点。これにより、デリゲートタイプを明示的に選択しなくても、メソッドグループをデリゲートに変換する方法がないことは明らかです。 – Evk

関連する問題