我的情况是 someFunction(int)
,我需要以编程方式生成 n
将调用它的按钮。这意味着我想创建按钮 B1
, B2
, ... Bn
那个电话 someFunction(1)
, someFunction(2)
, ... someFunction(n)
单击时。
这就是我尝试这样做的方式(半伪代码):
for (int i = 1; i <= n; i++) {
Button b = new Button();
b.Caption = "Value " + n; // non-WPF: b.Text = "Value " + n;
b.Click += (sender, event) => {
someFunction(i);
}
}
让我感到困扰的是,当我点击第一个按钮 (B1) 时,调试器在 someFunction(i)
上,它告诉我它正在调用 someFunction(n + 1)
.
我不确定这是为什么,也不知道如何解决。我使用的解决方法是使用,而不是 someFunction(i)
, someFunction(int.Parse(i.ToString())
(创建 i
的副本)。但这对我来说似乎很可疑,因为整数应该是值类型。
最佳答案
我相信您了解为什么会发生这种情况。问题是它捕获变量 i
本身,而不是它的值。对我来说似乎更好的解决方法(没有 toString 和 int.parse)是声明另一个复制 i
for (int i = 1; i <= n; i++) {
Button b = new Button();
b.Caption = "Value " + n; // non-WPF: b.Text = "Value " + n;
int locali = i;
b.Click += (sender, event) => {
someFunction(locali);
}
}
这样捕获的变量将是 locali
并且它在整个循环中保持不变。
关于c# - 动态生成调用 Lambda 函数的按钮——变量作用域,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5916849/