我试图在c#中测试这种在foreach中重用循环变量的情况,如下面的问题所述
Is there a reason for C#'s reuse of the variable in a foreach?
在浏览this和this之后,我尝试使用for循环重现此错误,因为foreach部分已在c#版本中修复。
但令我惊讶的是,当我尝试this code时,我得到了一个“索引超出了数组的范围。”代码异常。虽然我的数组有4个项目,但我正在尝试访问第3个索引。
public static void Main()
{
var strings = new string[] { "sd2", "dafs3", "dasd5", "fdf6" };
var actions = CreateActions(strings);
actions.ForEach(f => f());
}
private static List<Action> CreateActions(string[] strings)
{
var actions = new List<Action>();
for (int i = 0; i < 4; i++)
{
Console.WriteLine(i);
var fiber = strings[i];
actions.Add(() => Console.WriteLine(strings[i]));
}
return actions;
}
然后我改变了我的代码
public static void Main()
{
var strings = new string[] { "sd2", "dafs3", "dasd5", "fdf6" };
var actions = CreateActions(strings);
actions.ForEach(f => f());
}
private static List<Action> CreateActions(string[] strings)
{
var actions = new List<Action>();
for (int i = 0; i < 4; i++)
{
Console.WriteLine(i);
var fiber = strings[i];
actions.Add(() => Console.WriteLine(fiber));
}
return actions;
}
这段代码运行正常,我没有超出范围异常,这很奇怪。关于重用变量我的案例也得到了证明。
我的第一个代码有这个输出,如果在for循环中运行到索引2,则索引3抛出超出范围的异常。
0
1
2
fdf6
fdf6
fdf6
我的第二个代码片段给出了这个输出并列出了输出中的所有4个项目
0
1
2
3
sd2
dafs3
dasd5
fdf6
c#是否有任何解释或我的测试代码有任何问题。