In this line
listActions.Add(() => Console.WriteLine(i));
the variable i
, is captured, or if you wish, created a pointer to the memory location of that variable. That means that every delegate got a pointer to that memory location. After this loop execution:
foreach (int i in Enumerable.Range(1, 10))
{
listActions.Add(() => Console.WriteLine(i));
}
for obvious reasons i
is 10
, so the memory content that all pointers present in Action
(s) are pointing, becomes 10.
In other words, i
is captured.
By the way, should note, that according to Eric Lippert, this “strange” behaviour would be resolved in C# 5.0
.
So in the C# 5.0
your program would print as expected:
1,2,3,4,5...10
EDIT:
Can not find Eric Lippert’s post on subject, but here is another one: