0

次のコードがあります。

public class MyClass
{
    public void MyMethod()
    {
        Action<Child> aFoo = a => a.Foo();
    }
}

interface Parent1
{
    void Foo();
}

interface Parent2
{
    void Foo();
}

interface Child : Parent1, Parent2
{

}

ただし、コンパイラは、あいまいな呼び出しがあることを教えてくれますaFoo

やろうとしましAction<Child> aFoo = (A a) => a.Foo();たが、ラムダ式をデリゲート型に変換できないことがわかりましたSystem.Action<Child>

あいまいさのエラーを解決するにはどうすればよいですか?

4

2 に答える 2

4

aラムダの本体内の値をキャストすることにより:

Action<Child> aFoo = a => ((Parent1)a).Foo();

試みた解決策は、まったく別のことを行ったため機能しませんでした。 a を取るラムダ式を aParent1を取るデリゲートに適合させようとしましたChilda を受け取るデリゲートを aを受け取るデリゲートに適合させること可能ですが、これは不可能です。Parent1Child

Action<Child> aFoo = (Action<Parent1>)(a => a.Foo());

Action<T>は型 T で反変であるため、この後者の使用法は実行可能です。

于 2013-11-12T14:25:58.670 に答える
2

Action<T>はその型パラメーターTで共変ではなく、反変です。つまり、Action<object>に変換できますがAction<string>、その逆はできません。

一般に、Action<T>は (読み取り: に割り当てることができます)のサブタイプですが、 が のサブタイプであるAction<U>場合に限ります。UT

あなたの場合、Childは のサブクラスですParent。つまり、 は のサブクラスであり、これAction<Parent>Action<Child>行うことができます。

Action<Child> a = new Action<Parent> (... );

だがしかし:

Action<Parent> a = new Action<Child>( ... );

そうは言っても、代わりにラムダ パラメータをキャストしてみてください。

Action<C> aFoo = a => ((A)a).Foo();
于 2013-11-12T14:25:39.243 に答える