2013-03-31 5 views
5

fMethod ist ein Action<Fruit>. Wenn fMethod aufgerufen wird, ist der Parameter immer der letzte Eintrag von _Fruits.
Wie löst man das?C# Aktion in Foreach

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

möglich Duplikat [Gibt es einen Grund für C# 's Wiederverwendung der Variablen in einer foreach?] (Http://stackoverflow.com/questions/8898925/is-there-a-reason-for-cs- reuse-of-the-variable-in-a-foreach) – Joey

Antwort

9

Dies ist ein bekanntes Problem der Verwendung einer modifizierten Klausel in einem Aufruf, der einen Delegaten erstellt.

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

Dieses Problem wurde in C# 5 befestigt ist (see Eric Lippert's blog): eine temporäre Variable Hinzufügen sollte es lösen.

+3

Dieses Problem ** ist ** in C# 5.0 behoben: http://blogs.msdn.com/b/ericlippert/archive/2009/11/12/closing -over-the-loop-variable-adamined-dangerous.aspx –

+0

@ DasKrümelmonster Das ist sehr schön zu wissen, vielen Dank! – dasblinkenlight

1

Verwenden Sie eine Temperaturvariable.

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