关于scope:c_func:访问块中的局部变量

C# Func: access local variables in a block

本问题已经有最佳答案,请猛点这里访问。

假设我有这段代码在C:

1
2
3
4
5
6
7
8
9
10
11
12
static void Main(string[] args)
{
    List<Func<int>> fs = new List<Func<int>>();

    for (int i = 0; i < 5; i++)
        fs.Add(() => { return i; });

    for (int i = 0; i < 5; i++)
        Console.WriteLine(fs[i]());

    Console.ReadLine();
}

当我运行它时,我希望它能打印出来

1
2
3
4
5
0
1
2
3
4

但它印刷

1
2
3
4
5
5
5
5
5
5

相反。我的理解是func中的代码只保留一个到EDOCX1的地址(0),而不获取EDOCX1的值(0),应该避免这种方法。

所以我的问题是,有没有一种方法可以捕获局部变量并按值传递到Func中?


您可以使用for循环中的作用域捕获i值的副本:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
static void Main(string[] args)
{
    List<Func<int>> fs = new List<Func<int>>();

    for (int i = 0; i < 5; i++)
    {
        var copyOfi = i;
        fs.Add(() => { return copyOfi; });
    }

    for (int i = 0; i < 5; i++)
        Console.WriteLine(fs[i]());

    Console.ReadLine();
}

只需将循环变量存储在循环内的局部变量中,并在lambda表达式中使用它。