Considere el siguiente código:Usando la variable del iterador del bucle foreach en una expresión lambda, ¿por qué falla?
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;
}
...
}
Después de llamar myClass.Execute()
, el código imprime la siguiente respuesta inesperada:
Hi Int32 Hi Int32 Hi Int32
Obviamente, yo esperaría "Hi String"
, "Hi Single"
, "Hi Int32"
, pero al parecer no es el caso. ¿Por qué el último elemento de la matriz iterada se está utilizando en los 3 métodos en lugar del apropiado?
¿Cómo reescribirías el código para lograr el objetivo deseado?
Ni siquiera leí la pregunta, pero por el título, sé que la respuesta es: http://lorgonblog.spaces.live.com/blog/cns!701679AD17B6D310!689.entry – Brian
La variable variable capturada diariamente levanta su fea cabeza. – Marc