C#Func:访问块中的局部变量

时间:2014-07-31 14:07:08

标签: c# scope func

假设我在C#中有这段代码:

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();
}

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

0
1
2
3
4

但打印

5
5
5
5
5

代替。我的理解是,Func中的代码只保留i的地址,而不是获取i的值,应该避免这种方法。

所以我的问题是,有没有办法捕获局部变量并按值传递给Func

2 个答案:

答案 0 :(得分:4)

您可以使用for循环中的范围来捕获i:

的值的副本
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();
}

答案 1 :(得分:1)

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