我能够分配方法M
委托对象d
用更少的特定参数类型,但是当我想用相同的签名方法分配一个匿名方法M
到d
,我得到一个错误。
这是为什么?
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) { }
贾里德当然是正确的,这是由设计。
其原因设计是在逆变方法转换的情况下,你可能有,你没有写一个方法,并且将其分配到你没有写任何一个委托变量。 你无法控制的类型。 所以,我们去有点容易对你,让参数contravariantly匹配,并且返回类型协变匹配。
在拉姆达到委托的转换,你就控制被分配的东西。 没有什么距离使得它在参数类型完全匹配阻止你,因此,我们需要你。 没有捏造这里不允许。
这是包括在C#语言规范的第6.5节。 如果下明确键入一个匿名函数的参数,它们必须以兼容的签名两种类型和修饰符匹配。
具体而言,委托类型d是与设置一个匿名函数F兼容
...
如果F具有显式类型参数列表,在d的每个参数具有相同的类型和改性剂如F.相应参数
当你有你的答案,如果需要 ,我会提供一个解决方法。 喂,你得到的是签名的委托(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