无法分配委托匿名方法用更少的具体参数类型无法分配委托匿名方法用更少的具体参数类型(Can’t ass

2019-05-12 06:59发布

我能够分配方法M委托对象d用更少的特定参数类型,但是当我想用相同的签名方法分配一个匿名方法Md ,我得到一个错误。

这是为什么?

class derivedEventArgs : EventArgs { }

delegate void newDelegate(object o, derivedEventArgs e); 

static void Main(string[] args)
{
    newDelegate d = M; // ok
                d = (object o, EventArgs e) => { }; // error
}

public static void M(object o, EventArgs e) { }

Answer 1:

贾里德当然是正确的,这是由设计。

其原因设计是在逆变方法转换的情况下,你可能有,你没有写一个方法,并且将其分配到你没有写任何一个委托变量。 你无法控制的类型。 所以,我们去有点容易对你,让参数contravariantly匹配,并且返回类型协变匹配。

在拉姆达到委托的转换,你控制被分配的东西。 没有什么距离使得它在参数类型完全匹配阻止你,因此,我们需要你。 没有捏造这里不允许。



Answer 2:

这是包括在C#语言规范的第6.5节。 如果下明确键入一个匿名函数的参数,它们必须以兼容的签名两种类型和修饰符匹配。

具体而言,委托类型d是与设置一个匿名函数F兼容

...

如果F具有显式类型参数列表,在d的每个参数具有相同的类型和改性剂如F.相应参数



Answer 3:

当你有你的答案,如果需要 ,我会提供一个解决方法。 喂,你得到的是签名的委托(object, EventArgs)在这种情况下,你想将它转化成你的newDelegate类型,你可以这样做:

SomeDelegate p = (object o, EventArgs e) => { }; //comes from somewhere
NewDelegate d = (o, e) => p(o, e); //can rewrite like this

交替使用泛型和通用代表(禁忌)方差的特征,你可以用一个委托类型做到这一点:

delegate void NewDelegate<in T>(object o, T e) where T : EventArgs;

//then
NewDelegate<EventArgs> p = (object o, EventArgs e) => { }; //comes from somewhere
NewDelegate<DerivedEventArgs> d = p; //straightforward assignable - contravariance


文章来源: Can’t assign to delegate an anonymous method with less specific parameter type