Asp*_*Net 14 .net c# delegates
我能够分配的方法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) { }
Run Code Online (Sandbox Code Playgroud)
Jar*_*Par 16
这在C#语言规范的6.5节中有所介绍.如果明确键入匿名函数的参数,则它们必须在类型和修饰符中匹配才能成为兼容的签名.
具体地,委托类型D与提供的匿名功能F兼容
...
如果F具有明确类型化的参数列表,则D中的每个参数与F中的相应参数具有相同的类型和修饰符.
Eri*_*ert 15
Jared当然是正确的,这是设计的.
这种设计的原因是在逆变方法转换的情况下,你可能有一个你没有编写的方法,并将它分配给你没有编写的委托变量.您无法控制类型.所以我们对你有点容易,让参数相互匹配,返回类型协调匹配.
在lambda-to-delegate转换中,您可以控制所分配的内容.没有什么可以阻止你在参数类型中使它完全匹配,因此我们要求你.这里不允许捏造.