【问题标题】:C# Func: access local variables in a block [duplicate]C# Func:访问块中的局部变量
【发布时间】:2014-09-23 12:33:30
【问题描述】:

假设我在 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

【问题讨论】:

标签: c# scope func


【解决方案1】:

您可以使用 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();
}

【讨论】:

    【解决方案2】:

    只需将循环变量存储在循环内的局部变量中,然后在 lambda 表达式中使用即可。

    【讨论】:

      猜你喜欢
      • 2019-10-04
      • 1970-01-01
      • 2020-06-29
      • 2017-10-17
      • 2021-01-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多