2009-12-22 44 views
2

我有两种方法具有以下签名使用委托作为参数

void Invoke(Action method) 
void Foo() 

是什么的代码如下两行之间的区别?

Invoke(new Action(Foo)); 

Invoke(Foo); 

和在第二线允许?

谢谢

+0

您可能想要更好地格式化您的示例。没有错,只是为了清楚起见。请记住,如果一个问题是明确的,而且健康的人会更倾向于回答它。 美也帮助(格式等)。 – lorenzog

+0

纠错:第一种方法应如下阅读 void Invoke(Action method) 现在两行都会编译,但它们之间有什么区别? 谢谢 – Exulted

回答

2

你的签名是“Invoke(Delegate method)”(大写'D'),不是吗?

只有构建Action的第一行显式工作。

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

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

但是,如果你明确地创建委托,也可以隐式转换为代表,因此代码编译。

+0

是的,这正是我的typin :) 我认为这是值得解释你如何知道它的意思是'代表'? –

+0

嗯 - 如果在方法的参数列表中使用“委托”而不是“委托”,这将导致5个编译器错误,因为“委托”是定义委托和匿名方法的特殊关键字。 – Matthias

+0

在最后一次编辑之后(签名是“void Invoke(Action method)”)Maximilian Mayerl是对的。 – Matthias

3

你为什么不尝试呢?

如果你的方法的签名是

void Invoke(Action objAction) 

那么它就是合法的。然后这两个电话是一样的。这个功能被称为“隐式方法组转换”。