foreach循环中lambda中的奇怪变量

时间:2011-04-29 02:33:20

标签: .net

  

请参阅问题 Captured variable in a loop in C#

我想问为什么变量表现得很奇怪?

static void Main(string[] args)
    {

        int[] numbers = new int[] { 1, 2, 3 };

        List<Action> lst_WANT = new List<Action>();

        foreach (var currNum in numbers)
        {

            //--------- STRANGE PART -------------
            int holder = currNum;

            lst_WANT.Add(() =>
            {
                Console.WriteLine(holder);
            });
        }

        foreach (var want in lst_WANT)
            want();

        Console.WriteLine("================================================");

        List<Action> lst_DONT_WANT = new List<Action>();

        foreach (var currNum in numbers)
        {
            lst_DONT_WANT.Add(() =>
            {
                Console.WriteLine(currNum);
            });
        }

        foreach (var dont_want in lst_DONT_WANT)
            dont_want();

        Console.ReadKey();
    }

最终输出是:

1

2

3

-

3

3

3

1 个答案:

答案 0 :(得分:3)

所有lambda表达式都共享相同的currNum变量 循环结束后,该变量为3

通过使用在循环内声明的单独变量,您强制每个lambda表达式使用自己不变的变量。

Eric Lippert explains this