C#コード上ではローカル変数に見えているが、実際には内部の<>c__DisplayClass1クラスのフィールドになっている。入れ子になったクラスにあるラムダ式の実体がこの変数を使うためにフィールドに入れている。このように、ラムダ式と関係ない部分はふつうのローカル変数になる。int[0];」だが、ここもローカル変数に入れるだけ。先ほどvalのために生成したDisplayClassのメソッドを使ってFuncオブジェクトを生成し、Countメソッドに渡している。count);」の部分。ポイントはvalを使うのにラムダ式用の<>c__DisplayClass1を使っているところ。Program::Mainこのように、ラムダ式は、必要な変数を入れ子クラスのインスタンスにとっておいて、ラムダ式に書いた内容のメソッドが実行される、という形で実装されている。ラムダ式があれば必ず入れ子クラスが作られるかというとそうではなく、変数をとっておく必要がない場合、違う形にコンパイルされる。100;にするだけで、ILはこうなってしまう。ConsoleApplicationLinq.Programこっちのコードだとご丁寧にもFuncオブジェクトをstaticフィールドにキャッシュしている。ちなみに、valをローカル変数ではなくフィールドに持つようなクラスを作った場合も上述のconstの形に近くなり、入れ子クラスは作られない(Funcオブジェクトのキャッシュはしなくなる)。