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 ); };

?

この例では、2 番目のステートメントはコンパイル エラーを生成しますが、最初のステートメントは生成しません。

4

1 に答える 1

23

無名メソッドの構文はdelegate parameter-list { statement-list }です。パラメータ リストはオプションです。

パラメーター リストを省略した場合、匿名メソッドは、パラメーターが "out" とマークされていないすべてのデリゲート型と互換性があります。

パラメーター リストを指定する場合は、デリゲートパラメーターの型と正確に一致する必要があります。

最初のケースでは省略しており、2 番目のケースでは指定していますが、デリゲート パラメーターと一致していません。delegate {}合法であり、delegate (int i, int j) { }合法ですが、そうでdelegate () {}はありません。

いずれにせよ、おそらくラムダ式を使用した方がよいでしょう。これは、新しいコードでより一般的な構文 (i, j)=>{ }です。

于 2012-04-19T04:18:01.350 に答える