2013-03-31 13 views
5

fMethod è un Action<Fruit>.C# Azione in Foreach

Ma quando si chiama fMethod, il parametro è sempre l'ultima voce di _Fruits.
Come risolvere questo?

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

possibile duplicato del [C'è una ragione per il riutilizzo della variabile in un foreach C# s '?] (Http://stackoverflow.com/questions/8898925/is-there-a-reason-for-cs- reuse-of-the-variable-in-a-foreach) – Joey

risposta

9

Questo è un problema noto di utilizzare una clausola modificato in una chiamata che crea un delegato. Aggiunta di una variabile temporanea dovrebbe risolverlo:

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

Questo problema viene risolto in C# 5 (see Eric Lippert's blog).

+3

Questo problema ** è ** corretto in C# 5.0: http://blogs.msdn.com/b/ericlippert/archive/2009/11/12/closing -over-the-loop-variable-considered-harmful.aspx –

+0

@ DasKrümelmonster È molto bello sapere, grazie mille! – dasblinkenlight

1

Provare a utilizzare una variabile temporanea.

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