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

时间:2012-04-19 04:13:11

标签: c# delegates anonymous-methods

给出以下示例代码:

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 个答案:

答案 0 :(得分:23)

匿名方法的语法为delegate parameter-list { statement-list {{1} }。参数列表是可选的。

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

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

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

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