C# 使用代理作为参数

C# 使用代理作为参数,c#,C#,我有两个具有以下签名的方法 void Invoke(Action method) void Foo() 以下两行代码之间的区别是什么 Invoke(new Action(Foo)); 及 第二行可以吗 谢谢你为什么不试试呢 如果您的方法的签名是 void Invoke(Action objAction) 那么它是合法的。然后这两个电话是一样的。此功能称为“隐式方法组转换”。您的签名是“Invoke(Delegate method)”(大写“D”),不是吗 只有构造动作的第一行可以显式工作

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

void Invoke(Action method)
void Foo()
以下两行代码之间的区别是什么

Invoke(new Action(Foo));

第二行可以吗

谢谢你为什么不试试呢

如果您的方法的签名是

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

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

只有构造动作的第一行可以显式工作

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

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


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

您可能希望将示例的格式设置得更好一些。没什么错,只是为了清楚起见。请记住,如果一个问题是明确的和摆好姿势的,人们会更倾向于回答它。美也有帮助(格式化等)。更正:第一个方法应该如下所示:void Invoke(Action方法)现在两行都将编译,但是它们之间有什么区别?谢谢,这正是我要输入的:)我认为值得解释一下,你是如何知道它应该是
委托的
?如果你在方法的参数列表中使用“Delegate”而不是“Delegate”,这将导致五个编译器错误,即“Delegate”是一个用于定义委托和匿名方法的特殊关键字。在最后一次编辑之后(签名为“void Invoke(Action method)”),Maximilian Mayerl是对的。
void Invoke(Action objAction)