C# 事件无法使用正确的参数值调用匿名方法

C# event cannot call anonymous method with the correct argument value

我有这个代码:

for (int i = 0; i < 7; ++i)
    Roption.DropDownItems.Add(string.Concat("Item &", i), null, delegate { Reset(i); });

其中 Reset() 在单击下拉项时调用。

问题是无论点击哪个下拉项,传给Reset的参数都是7(循环结束后i的值),而不是[=13的值=] 当调用 Roption.DropDownItems.Add 函数时。是什么导致了这种行为,如何解决? (我真的不想在七个其他方面相同的语句中对 0 到 6 进行硬编码)。

您的问题是,当您在循环中创建委托时,所有对象都将通过引用传递。这意味着无论它们是值类型还是引用类型对象,它们仍然会通过引用传递。

那么这对您的代码意味着什么?那么,随着循环迭代,所有具有 i 副本的 Reset 方法调用都引用了同一个方法。因此,随着 i 的值增加,每个引用的值也会增加。

Closures Explained