The demo code has some problems.
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());
Most people expect it to be 100 / 110 / 120. It is in fact 120 / 120 / 120.
but the result in vs2015 & .net 4.5.1 will output 100 / 110 / 120, not 120 / 120 / 120.
And when I test the code as follows, there are some differences between for
and 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());
Who can give me some more detail between for
and foreach
in closures
?