我有两种方法具有以下签名使用委托作为参数
void Invoke(Action method)
void Foo()
是什么的代码如下两行之间的区别?
Invoke(new Action(Foo));
和
Invoke(Foo);
和在第二线允许?
谢谢
我有两种方法具有以下签名使用委托作为参数
void Invoke(Action method)
void Foo()
是什么的代码如下两行之间的区别?
Invoke(new Action(Foo));
和
Invoke(Foo);
和在第二线允许?
谢谢
你的签名是“Invoke(Delegate method)”(大写'D'),不是吗?
只有构建Action的第一行显式工作。
背后的原因:Delegate是所有代表的基类。它表示具有未知返回值和未知数量和类型参数的代表。 您只能使用DynamicInvoke调用它。
所以编译器不知道,只传递一个方法名称时使用的委托的实际类型:“Invoke(Foo);”。它可以是一个Action,也可以是另一个与Foo签名相同的代表。
但是,如果你明确地创建委托,也可以隐式转换为代表,因此代码编译。
你为什么不尝试呢?
如果你的方法的签名是
void Invoke(Action objAction)
那么它就是合法的。然后这两个电话是一样的。这个功能被称为“隐式方法组转换”。
您可能想要更好地格式化您的示例。没有错,只是为了清楚起见。请记住,如果一个问题是明确的,而且健康的人会更倾向于回答它。 美也帮助(格式等)。 – lorenzog
纠错:第一种方法应如下阅读 void Invoke(Action method) 现在两行都会编译,但它们之间有什么区别? 谢谢 – Exulted