MethodInvoker的这种用法的正确语法是什么?

时间:2010-09-17 22:27:41

标签: c# invoke

以下代码编译并运行正常。

void myInvokedMethod(string s)
{
    Console.WriteLine(s);
}

void myInvoker()
{
    Invoke(new MethodInvoker(delegate() { myInvokedMethod("one"); }));
    Invoke(new MethodInvoker(delegate   { myInvokedMethod("two"); }));
}

当我致电 myInvoker 时,两次对 myInvokedMethod 的调用都会通过。 委托后的括号是什么意思,为什么它们看起来是可选的?

2 个答案:

答案 0 :(得分:3)

它们指定了anonymous method所采用的形式参数,如果没有,则它们是可选的。如果声明它没有参数列表,则可以将其分配给具有参数的委托类型。

答案 1 :(得分:3)

括号称为匿名方法参数列表,在这种情况下为空。匿名方法没有类型 - 编译器尝试执行隐式转换。如果给出了匿名方法的签名,则它必须与委托的签名匹配。

如果以下所有内容都成立,则也可以进行隐式转换:

  • 省略了委托的形式参数列表
  • 代表没有输出参数
  • 返回类型匹配

第二个例子就是这种情况。所以这两行之间没有区别 - 两者都做同样的事情。这是另一个例子:

var x1 = new ParameterizedThreadStart(delegate(object o) {}); // Compiles.
var x2 = new ParameterizedThreadStart(delegate {});           // Compiles.
var x3 = new ParameterizedThreadStart(delegate() {});         // Does not compile.

最后两个示例显示delegate(){}delegate{}一般不相同。它们仅在您的情况下是等效的,因为MethodInvoker不带参数。有关更多详细信息和更多示例,请参阅C#规范第21节。