演示代码存在一些问题。
var values = new List<int>() { 100, 110, 120 };
var funcs = new List<Func<int>>();
foreach(var v in values)
funcs.Add( ()=>v );
foreach(var f in funcs)
Console.WriteLine(f());
大多数人期望它是100/110/120,但实际上是120/120/120。
但是在vs2015和.net 4.5.1中,结果将输出100/110/120,而不是120/120/120。
当我按照以下方式测试代码时,for
和foreach
之间存在一些差异。
var values = new List<int> {100, 110, 120};
var funcs = new List<Func<int>>();
foreach (var v in values)
funcs.Add(() =>
{
Console.WriteLine(v);
return v;
} );
foreach (var f in funcs)
Console.WriteLine(f());
//will throw exception
for (int i=0;i<values.Count;i++)
funcs.Add(() =>
{
Console.WriteLine(values[i]);
return values[i];
});
foreach (var f in funcs)
Console.WriteLine(f());
谁能给我更详细地解释一下闭包中的for
和foreach
之间的区别?