[c#] なぜいくつかのC#ラムダ式は静的メソッドにコンパイルされますか?



Answers

「アクションメソッド」は、実装の副作用としてのみ静的です。 これは、キャプチャされた変数を持たない匿名メソッドのケースです。 捕捉された変数がないので、この方法は、一般的な局所変数の場合を上回る追加の寿命要件を持たない。 それが他のローカル変数を参照した場合、その寿命は他の変数の存続期間に及ぶ(C.1.0仕様では、L.1.7、 ローカル変数 、秒N.15.5.1、 キャプチャされた外部変数を参照)。

C#仕様では、「匿名クラス」ではなく「式ツリー」に変換されている匿名メソッドについてのみ説明しています。 式ツリーは、Microsoftコンパイラなどの追加のC#クラスとして表現できますが、この実装は必須ではありません(C#5.0仕様では、M.5.3で認識されます)。 したがって、匿名関数が静的であるかどうかは未定義です。 また、K.6節では、表現木の細部について多くのことを開いている。

Question

以下のコードでわかるように、私は変数としてAction<>オブジェクトを宣言しています。

なぜこのアクションメソッドデリゲートが静的メソッドのように振る舞うのか教えてください。

なぜ次のコードでtrueを返すのでしょうか?

コード:

public static void Main(string[] args)
{
    Action<string> actionMethod = s => { Console.WriteLine("My Name is " + s); };

    Console.WriteLine(actionMethod.Method.IsStatic);

    Console.Read();
}

出力:




このメソッドはクロージャを持たず、静的メソッド自体(Console.WriteLine)も参照しているので、静的であることが期待されます。 このメソッドはクロージャーのために囲む匿名型を宣言しますが、この例では必須ではありません。




Links