2
このオブジェクトの有効期限を延長するクロージャーはC#コンパイラのバグですか?
私がいくつかの極端に遭遇したとき、私はオブジェクトのライフタイムを(合法的に)延長する可能性についての質問に答えていましたC#コンパイラーの奇妙なコード生成(問題の場合は4.0。 私が見つけることができる最も短い再現は次のとおりです: staticを呼び出しているときにローカルをキャプチャするラムダを作成する 包含型のメソッド。 生成されたデリゲート参照を、それを含むオブジェクトのインスタンスフィールドに割り当てます。 結果:コンパイラーは、理由がない場合にラムダを作成したオブジェクトを参照するクロージャーオブジェクトを作成します。デリゲートの「内部」ターゲットは静的メソッドであり、ラムダ作成オブジェクトのインスタンスメンバーは不要です。デリゲートが実行されたときに触れられる(されない)。事実上、コンパイラーは、プログラマーがthis理由なしに取り込んだように機能します。 class Foo { private Action _field; public void InstanceMethod() { var capturedVariable = Math.Pow(42, 1); _field = () => StaticMethod(capturedVariable); } private static void StaticMethod(double arg) { } } リリースビルドから生成されたコード(「より単純な」C#に逆コンパイル)は、次のようになります。 public void InstanceMethod() { <>c__DisplayClass1 CS$<>8__locals2 = new <>c__DisplayClass1(); CS$<>8__locals2.<>4__this = this; // What's …