使用圆括号将匿名方法分配给委托会导致编译器错误?

9

以下是示例代码:

static void SomeMethod()
{
  Action<int,int> myDelegate;

  //...

  myDelegate = delegate { Console.WriteLine( 0 ); };
  myDelegate = delegate() { Console.WriteLine( 0 ); };  // compile error

}

什么是两者之间的区别?
myDelegate = delegate { Console.WriteLine( 0 ); };

并且

myDelegate = delegate() { Console.WriteLine( 0 ); };

在这个例子中,第二条语句会产生编译错误,而第一条则不会。
1个回答

23
一个匿名方法的语法为:delegate parameter-list { statement-list }。参数列表是可选的。
如果省略参数列表,则匿名方法与未标记为“out”的任何委托类型兼容。
如果提供了参数列表,则它必须与委托参数类型完全匹配。
在第一个情况下,您省略了参数列表;而在第二个情况下,您提供了参数列表,但未匹配委托参数。因此,delegate {} 是合法的,delegate (int i, int j) { } 也是合法的,但 delegate () {} 不合法。
无论如何,您最好使用lambda表达式,它是新代码中更常见的语法:(i, j)=>{ }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接