使用委托作为参数

时间:2009-12-22 09:38:54

标签: c#

我有两种具有以下签名的方法

void Invoke(Action method)
void Foo()

以下两行代码有什么区别?

Invoke(new Action(Foo));

Invoke(Foo);

并且是允许的第二行吗?

由于

2 个答案:

答案 0 :(得分:3)

你为什么不试试?

如果方法的签名是

void Invoke(Action objAction)
那么它是合法的。然后2个电话是相同的。此功能称为“隐式方法组转换”。

答案 1 :(得分:2)

您的签名是“调用(委托方法)”(大写“D”),不是吗?

只有构建Action的第一行才能明确起作用。

背后的原因:Delegate是所有代表的基类。它表示具有未知返回值和未知数量和参数类型的委托。 您只能使用DynamicInvoke调用它。

因此,编译器不知道在传递方法名称时要使用的实际委托类型:“Invoke(Foo);”。它可以是一个Action,也可以是另一个与Foo具有相同签名的委托。

但是,如果您显式创建委托,则可以将其隐式转换为委托,因此代码可以编译。