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();但它告诉我我无法将 lambda 表达式转换为委托类型System.Action<Child>

如何解决歧义错误?

4

2 回答 2

4

a通过在 lambda 体内转换 的值:

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

您尝试的解决方案没有奏效,因为它完全做了其他事情:它试图将一个lambda 表达式Parent1放入一个接受a的委托Child中。这是不可能的,即使可以将接受 a 的代表放入接受 aParent1代表中Child

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>是 (read: can be assigned to)的子类型Action<U>,只有当U是 的子类型时T

在您的情况下,Child是 的子类Parent,这意味着Action<Parent>是 的子类Action<Child>,允许您执行以下操作:

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

但不是:

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

话虽如此,请尝试转换 lambda 参数:

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