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

C#Func:访问块中的局部变量,c#,scope,func,C#,Scope,Func,假设我用C语言编写了这段代码: 但它会打印出来 5 5 5 5 5 相反。我的理解是,Func中的代码只保留i的地址,而不是获取i的值,应该避免这种方法 所以我的问题是,有没有办法捕获局部变量并通过值将它们传递到Func中?只需将循环变量存储在循环中的局部变量中,并在lambda表达式中使用它。您可以使用for循环中的作用域来捕获i值的副本: static void Main(string[] args) { List<Func<int>> fs = new L

假设我用C语言编写了这段代码:

但它会打印出来

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


所以我的问题是,有没有办法捕获局部变量并通过值将它们传递到
Func
中?

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

您可以使用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();
}
static void Main(字符串[]args)
{
List fs=新列表();
对于(int i=0;i<5;i++)
{
var copyOfi=i;
fs.Add(()=>{return copyOfi;});
}
对于(int i=0;i<5;i++)
Console.WriteLine(fs[i]());
Console.ReadLine();
}

我还没有找到它,但我知道有重复的。另见
5
5
5
5
5
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();
}