假设我在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
?
答案 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表达式中使用它。