我遇到了一个关于 C# 的有趣问题。我有如下代码。列表 >actions=新列表 >();int 变量 = 0;while (变量 < 5){actions.Add((...
我遇到了一个有关 C# 的有趣问题。我有如下代码。
List<Func<int>> actions = new List<Func<int>>(); int variable = 0; while (variable < 5) { actions.Add(() => variable * 2); ++ variable; } foreach (var act in actions) { Console.WriteLine(act.Invoke()); }
我希望它输出 0、2、4、6、8。但是,它实际上输出了五个 10。
看起来这是因为所有操作都引用一个捕获的变量。因此,当它们被调用时,它们都有相同的输出。
有没有办法解决这个限制,让每个动作实例都有自己的捕获变量?
这被称为闭包问题,只需使用复制变量即可完成。
List<Func<int>> actions = new List<Func<int>>(); int variable = 0; while (variable < 5) { int i = variable; actions.Add(() => i * 2); ++ variable; } foreach (var act in actions) { Console.WriteLine(act.Invoke()); }