所以我有一些int x我需要传递给另一个函数,问题是在我使用函数之前x更改,所以值x变为不同于我想要的值。有没有办法复制一个整数(我找不到一个)?这将解决我的问题。
private void Init()
{
for (int x = 0; x < 10; x++)
{
for (int y = 0; y < 10; y++)
{
Button tmpButton = new Button();
tmpButton.Click += (sender, e) => ButtonClick(sender, e, x, y);
//x and y need to "freeze" their value at this point
}
}
}
private void ButtonClick(object sender, EventArgs e, int x, int y)
{
Console.Out.WriteLine(x.ToString() + ":" y.ToString());
}
输出:“10:10”
预期输出(如果点击按钮3,4):“3:4”
答案 0 :(得分:2)
答案 1 :(得分:1)
您应该使用临时变量:
for (int x = 0; x < 10; x++)
{
for (int y = 0; y < 10; y++)
{
int tempX = x;
int tempY = y;
Button tmpButton = new Button();
tmpButton.Click += (sender, e) => ButtonClick(sender, e, tempX, tempY);
//x and y need to "freeze" their value at this point
}
}
在循环中捕获变量时应始终小心。
基本上,发生的事情是你的lambda正在捕获变量而不是变量的值。因此,当按下按钮时,循环当然已完成,变量的值为10.
Eric Lippert写了great series来解释为什么会这样。