How do closures differ between foreach and list.ForEach ()?


Consider this code.

        var values = new List<int> {123, 432, 768};

        var funcs = new List<Func<int>>();


        funcs.ForEach(f=>Console.WriteLine(f()));//prints 123,432,768


        foreach (var v1 in values)

        foreach (var func in funcs)
            Console.WriteLine(func());  //prints 768,768,768

I know that the second foreach prints 768 3 times because of the closure variable captured by the lambda. why does it not happen in the first case?How does foreach keyword different from the method Foreach? Is it beacuse the expression is evaluated when i do values.ForEach

foreach only introduces one variable. While the lambda parameter variable is "fresh" each time it is invoked.

Compare with:

foreach (var v1 in values) // v1 *same* variable each loop, value changed
   var freshV1 = v1; // freshV1 is *new* variable each loop
   funcs.Add(() => freshV1);

foreach (var func in funcs)
   Console.WriteLine(func()); //prints 123,432,768

That is,

foreach (T v in ...) { }

can be thought of as:

T v;
foreach(v in ...) {}

Happy coding.