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),应该避免这种方法。
所以我的问题是,有没有一种方法可以捕获局部变量并按值传递到
您可以使用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表达式中使用它。