2013-03-31 7 views
5

fMethod является Action<Fruit>.C# Действие в передней части

Но когда вызывается fMethod, параметр всегда является последней записью _Fruits.
Как это решить?

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

возможно дубликат [Есть ли причина для повторного использования переменной в Еогеасп С #?] (Http://stackoverflow.com/questions/8898925/is-there-a-reason-for-cs- reuse-of-the-variable-in-a-foreach) – Joey

ответ

9

Это хорошо известная проблема использования измененного предложения в вызове, который создает делегат. Добавление временной переменной должно решить:

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

Эта проблема решена в C# 5 (see Eric Lippert's blog).

+3

Эта проблема ** исправлена ​​в C# 5.0: http://blogs.msdn.com/b/ericlippert/archive/2009/11/12/closing -over-the-loop-variable-think-harm.aspx –

+0

@ DasKrümelmonster Это очень приятно узнать, спасибо вам большое! – dasblinkenlight

1

Попробуйте использовать временную переменную.

foreach(Fruit f in _Fruits) 
{ 
    var temp = f; 
    field.Add(new Element(temp.ToString(),delegate{fMethod(temp);})); 
} 
Смежные вопросы