【问题标题】:C# event cannot call anonymous method with the correct argument valueC# 事件无法调用具有正确参数值的匿名方法
【发布时间】:2016-06-19 21:37:56
【问题描述】:

我有这个代码:

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

点击下拉项时调用Reset()

问题是无论点击哪个下拉项,传递给Reset的参数都是7(循环终止后i的值),而不是Roption.DropDownItems.Add函数时i的值叫做。是什么导致了这种行为,如何解决? (我真的不想在七个相同的语句中硬编码 0 到 6)。

【问题讨论】:

标签: c# events delegates anonymous-function


【解决方案1】:

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

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

Closures Explained

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-15
    • 2015-03-30
    • 1970-01-01
    • 2011-01-05
    • 2012-05-26
    • 2019-02-26
    相关资源
    最近更新 更多