我的游戏中有一个GUI设置代码,例如:
for (int i = 0; i < count; i++)
{
...
Button button = new Button();
...
button.handler = delegate { selectedIndex = i; };
gui.Add(button);
...
}
我想将按钮更改为selectedIndex
到当前值i
,这是创建它的时间。即button0将其更改为0,button1更改为1,依此类推。但它似乎将代理中的值与i
变量进行了dinamycally链接,并且所有按钮都将selectedIndex
更改为count + 1
。
如何解决?
答案 0 :(得分:3)
您正在遇到匿名函数中捕获的内容的common problem。您正在代理中捕获i
,并且该值会在循环过程中发生变化。
您需要i
的副本:
for (int i = 0; i < count; i++)
{
int copy = i;
...
Button button = new Button();
...
button.handler = delegate { selectedIndex = copy; };
gui.Add(button);
...
}
请注意,foreach
循环在C#4中具有相同的问题,但在C#5中,foreach
循环中的迭代变量在每次迭代时都是一个“新”变量。