ラムダ式

C#ラムダ式では、ローカル変数はスコープの最後の値になる。

ローカル変数だと思って使っているのは、実はnewされたインスタンスであり、ラムダ式を含む関数ではいつの間にかローカル変数をメンバにもつ無名のクラスが出来ている。そのインスタンスの値を使うだけだから、インスタンスの最後の状態、関数を抜けた時の状態になる。

クラスはスコープの単位で作られていて、関数が同じでもスコープが違うと違うクラスになる。例えばfor文のiをラムダ式に入れようとするとループを抜けた時の値になってしまっておかしなことになるが、forの中のスコープのローカル変数にコピーすれば、新しくインスタンスが作られ、その時のiの値が保持できる。つまりいちいちiの値をコピーしただけのインスタンスがループのたびにnewされる。