2010-09-17 91 views
3

以下代码编译并运行正常。MethodInvoker的这种用法的正确语法是什么?

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

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

当我打电话myInvoker,以两个呼叫myInvokedMethod打通。 代表之后的括号是什么意思,为什么它们看起来是可选的?

回答

3

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

隐式转换也是可能的,如果下面的所有持有:

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

第二个例子就是这种情况。所以这两条线没有区别 - 两者都是一样的。下面是另一个例子:

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节。

3

它们指定anonymous method需要的形式参数,如果不带任何参数,它们是可选的。如果在没有参数列表的情况下进行声明,则可以将其分配给确实带参数的委托类型。