使用括号分配匿名方法进行委托会产生编译错误?

Set*_*o N 9 c# delegates anonymous-methods

给出以下示例代码:

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

  //...

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

}
Run Code Online (Sandbox Code Playgroud)

有什么区别

myDelegate = delegate { Console.WriteLine( 0 ); };
Run Code Online (Sandbox Code Playgroud)

和

myDelegate = delegate() { Console.WriteLine( 0 ); };
Run Code Online (Sandbox Code Playgroud)

?

在此示例中,第二个语句生成编译错误,而第一个语句则不生成编译错误.

Eri*_*ert 23

一个匿名方法的语法是delegate 参数列表 { 语句列表 }.参数列表是可选的.

如果省略参数列表,则匿名方法与参数未标记为"out"的任何委托类型兼容.

如果提供参数列表,则它必须与委托参数类型完全匹配.

在第一种情况下,您省略了它,在第二种情况下,您提供它但不匹配委托参数.这delegate {}是合法的,delegate (int i, int j) { }是合法的,但delegate () {}不是.

无论如何,你最好使用lambda表达式; 它是新代码中更常见的语法: (i, j)=>{ };