Consultez le code suivant:Utilisation de la variable itératrice de la boucle foreach dans une expression lambda - pourquoi échoue?
public class MyClass
{
public delegate string PrintHelloType(string greeting);
public void Execute()
{
Type[] types = new Type[] { typeof(string), typeof(float), typeof(int)};
List<PrintHelloType> helloMethods = new List<PrintHelloType>();
foreach (var type in types)
{
var sayHello =
new PrintHelloType(greeting => SayGreetingToType(type, greeting));
helloMethods.Add(sayHello);
}
foreach (var helloMethod in helloMethods)
{
Console.WriteLine(helloMethod("Hi"));
}
}
public string SayGreetingToType(Type type, string greetingText)
{
return greetingText + " " + type.Name;
}
...
}
Après avoir appelé myClass.Execute()
, le code imprime la réponse inattendue suivante:
Hi Int32 Hi Int32 Hi Int32
De toute évidence, je me attends "Hi String"
, "Hi Single"
, "Hi Int32"
, mais apparemment ce n'est pas Cas. Pourquoi le dernier élément du tableau itéré est utilisé dans toutes les 3 méthodes au lieu de la appropriée?
Comment réécrire le code pour atteindre l'objectif souhaité?
Je n'ai même pas lu la question, mais à partir du titre, je sais que la réponse est: http://lorgonblog.spaces.live.com/blog/cns!701679AD17B6D310!689.entry – Brian
La question des variables capturées quotidiennement dresse sa tête laide. – Marc