5

fMethod是一个Action<Fruit>

但是当fMethod被调用时,参数始终是_Fruits.
如何解决这个问题?

foreach(Fruit f in _Fruits)
{
   field.Add(new Element(f.ToString(),delegate{fMethod(f);}));
}
4

2 回答 2

9

这是一个众所周知的问题,即在创建委托的调用中使用修改的子句。添加一个临时变量应该可以解决它:

foreach(Fruit f in _Fruits)
{
    Fruit tmp = f;
    field.Add(new Element(f.ToString(),delegate{fMethod(tmp);}));
}

这个问题在 C# 5 中得到修复(参见 Eric Lippert 的博客)。

于 2013-03-31T12:10:01.283 回答
1

尝试使用临时变量。

foreach(Fruit f in _Fruits)
{
   var temp = f;
   field.Add(new Element(temp.ToString(),delegate{fMethod(temp);}));
}
于 2013-03-31T12:10:22.897 回答