c# - Lambda variable capture in loop - what happens here? -
i trying head around, happens here ? sort of code compiler produce?
public static void vc() { var listactions = new list<action>(); foreach (int in enumerable.range(1, 10)) { listactions.add(() => console.writeline(i)); } foreach (action action in listactions) { action(); } } static void main(string[] args) { vc(); }
output: 10 10 .. 10
according this, new instance of actionhelper created every iteration. in case, assume should print 1..10. can give me pseudo code of compiler doing here ?
thanks.
in line
listactions.add(() => console.writeline(i));
the variable i
, captured, or if wish, created pointer memory location of variable. means every delegate got pointer memory location. after loop execution:
foreach (int in enumerable.range(1, 10)) { listactions.add(() => console.writeline(i)); }
for obvious reasons i
10
, memory content pointers present in action
(s) pointing, becomes 10.
in other words, i
captured.
by way, should note, according eric lippert, "strange" behaviour resolved in c# 5.0
.
so in c# 5.0
program print as expected:
1,2,3,4,5...10
edit:
can not find eric lippert's post on subject, here one: