【发布时间】:2013-09-25 16:48:54
【问题描述】:
我有以下代码...
namespace ConsoleApplication2
{
public delegate void Task();
class Scheduler
{
private List<Task> tasks = new List<Task>();
public void AddTask(Task myTask)
{
tasks.Add(myTask);
}
public void Start()
{
foreach (var task in tasks)
task();
}
}
class Program
{
static void Main(string[] args)
{
var list = new List<string>() { "A", "B", "C" };
var scheduler = new Scheduler();
foreach (var item in list)
{
scheduler.AddTask(() => { Console.WriteLine(item); });
}
scheduler.Start();
}
}
}
输出是……
C
C
C
但是,如果我将 Main 方法的 foreach 部分更改为:
foreach (var item in list)
{
var i = item;
scheduler.AddTask(() => { Console.WriteLine(i); });
}
我得到以下输出:
A
B
C
我的愚蠢假设是两个程序都应该生成相同的输出。有人可以解释一下为什么会这样吗?
【问题讨论】:
-
阅读 Eric Lippert 的博文:blogs.msdn.com/b/ericlippert/archive/2009/11/12/…
-
请注意,这在 C# 5 中已“修复”,将不再发生。您将从任一选项中获得第二个输出。
-
这不仅适用于 lambda,也适用于一般的委托闭包。
-
@ReedCopsey 这仅适用于
foreach循环,适用于其他类型的循环,例如for(int i = 0; i < 10; i++)你还需要使用临时变量。 -
@csharpfolk 是的 - 但是这个具体的例子是固定的;)