これは、C# 5.0 では正常に動作します (期待どおりです)。
var actions = new List<Action>();
foreach (var i in Enumerable.Range(0, 10))
{
actions.Add(() => Console.WriteLine(i));
}
foreach (var act in actions) act();
0 から 9 を出力します。しかし、これは 10 回に対して 10 を示します。
var actions = new List<Action>();
for (var i = 0; i < 10; i++)
{
actions.Add(() => Console.WriteLine(i));
}
foreach (var act in actions) act();
質問: これは 5.0 より前のバージョンの C# で発生した問題です。そのため、クロージャーにループ ローカル プレースホルダーを使用する必要がありましたが、現在は C# 5.0 で "foreach" ループで修正されています。ただし、「for」ループではありません。
この背後にある理由は何ですか (for
ループの問題も修正されていません)?