我想知道是什么现象是怎么回事:
转换一个List<string>
到列表代表返回相同的字符串出错。
这发生在WrongConversion
当我直接工作在foreach
通过输入列表返回的变量。 (列表中的最后一个字符串是每次返回的)
在CorrectConversion
中,我首先分配一个局部变量并在委托中使用它。
这项任务起初似乎是多余的。
输入:
using System.Collections.Generic;
class Program
{
delegate string StringReturner();
static void Main(string[] args)
{
var list = new List<string> { "a", "b", "c" };
Display(WrongConversion(list));
Display(CorrectConversion(list));
System.Console.ReadKey();
}
static List<StringReturner> WrongConversion(List<string> list)
{
var result = new List<StringReturner>();
foreach (var s in list)
{
result.Add(() => { return s; }); // <========= s is always "c" ?
}
return result;
}
static List<StringReturner> CorrectConversion(List<string> list)
{
var result = new List<StringReturner>();
foreach (var s in list)
{
var localString = s; // <========= What happens here?
result.Add(() => { return localString; });
}
return result;
}
private static void Display(List<StringReturner> list)
{
foreach (var stringReturner in list)
System.Console.Write(stringReturner());
System.Console.WriteLine();
}
}
输出:
ccc
abc
这是一百万个问题的重复。它与关闭局部变量有关。 – jason