我注意到以下内容。这个 C# 代码:
List<Action> methodList = new List<Action>();
for (int iFn = 0; iFn < 4; ++iFn)
{
void thisLocalFunction()
{
string output = iFn.ToString();
Console.WriteLine(output);
}
methodList.Add(thisLocalFunction);
}
for (int iFn = 0; iFn < methodList.Count; ++iFn)
{
methodList[iFn]();
}
产生 4, 4, 4, 4。另一方面,这段代码:
List<Action> methodList = new List<Action>();
for (int iFn = 0; iFn < 4; ++iFn)
{
string output = iFn.ToString();
void thisLocalFunction()
{
Console.WriteLine(output);
}
methodList.Add(thisLocalFunction);
}
for (int iFn = 0; iFn < methodList.Count; ++iFn)
{
methodList[iFn]();
}
产生 0、1、2、3。
我不确定我明白为什么。我读过一些关于“捕获”的文章,但我不确定这是否与这里发生的事情有关。有人可以告诉我为什么这两种实现的行为不同吗?