我有两种具有以下签名的方法
void Invoke(Action method)
void Foo()
以下两行代码有什么区别?
Invoke(new Action(Foo));
和
Invoke(Foo);
并且是允许的第二行吗?
由于
答案 0 :(得分:3)
你为什么不试试?
如果方法的签名是
void Invoke(Action objAction)
那么它是合法的。然后2个电话是相同的。此功能称为“隐式方法组转换”。
答案 1 :(得分:2)
您的签名是“调用(委托方法)”(大写“D”),不是吗?
只有构建Action的第一行才能明确起作用。
背后的原因:Delegate是所有代表的基类。它表示具有未知返回值和未知数量和参数类型的委托。 您只能使用DynamicInvoke调用它。
因此,编译器不知道在传递方法名称时要使用的实际委托类型:“Invoke(Foo);”。它可以是一个Action,也可以是另一个与Foo具有相同签名的委托。
但是,如果您显式创建委托,则可以将其隐式转换为委托,因此代码可以编译。