无法分配委托具有较少特定参数类型的匿名方法

Asp*_*Net 14 .net c# delegates

我能够分配的方法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) { }
Run Code Online (Sandbox Code Playgroud)

Jar*_*Par 16

这在C#语言规范的6.5节中有所介绍.如果明确键入匿名函数的参数,则它们必须在类型和修饰符中匹配才能成为兼容的签名.

具体地,委托类型D与提供的匿名功能F兼容

...

如果F具有明确类型化的参数列表,则D中的每个参数与F中的相应参数具有相同的类型和修饰符.


Eri*_*ert 15

Jared当然是正确的,这是设计的.

这种设计的原因是在逆变方法转换的情况下,你可能有一个你没有编写的方法,并将它分配给你没有编写的委托变量.您无法控制类型.所以我们对你有点容易,让参数相互匹配,返回类型协调匹配.

在lambda-to-delegate转换中,您可以控制所分配的内容.没有什么可以阻止你在参数类型中使它完全匹配,因此我们要求你.这里不允许捏造.