Чем отличаются замыкания между foreach и list.ForEach ()?

Рассмотрим этот код.

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

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

        values.ForEach(v=>funcs.Add(()=>v));

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

        funcs.Clear();

        foreach (var v1 in values)
        {
            funcs.Add(()=>v1);
        }

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

Я знаю, что второй foreach выводит 768 3 раза из-за закрывающей переменной, захваченной лямбда. почему этого не происходит в первом случае? Чем ключевое слово foreach отличается от метода Foreach ? Это потому, что выражение вычисляется, когда я делаю values.ForEach

5
задан Ashley John 24 March 2012 в 22:17
поделиться