Esta es una pregunta basada en el artículo "Closing over the loop variable considered harmful" por Eric Lippert.
Es una buena lectura, Eric explica por qué después de esta pieza de código todos funcs devolverán el último valor en v:Cómo | ¿Dónde se almacenan las variables cerradas?
var funcs = new List<Func<int>>();
foreach (var v in values)
{
funcs.Add(() => v);
}
Y la versión correcta parece:
foreach (var v in values)
{
int v2 = v;
funcs.Add(() => v2);
}
Ahora mi pregunta es cómo y dónde están almacenadas esas variables 'v2' capturadas. En mi comprensión de la pila, todas esas variables v2 ocuparía la misma pieza de memoria.
Mi primer pensamiento fue el boxeo, cada miembro de la función manteniendo una referencia a un v2 en caja. Pero eso no explicaría el primer caso.
OK, después de leer mi propia pregunta, supongo que se explicaría por: en la primera versión, 'v' está encuadrada una vez y la referencia se vuelve a utilizar. Pero me gustaría ver una respuesta más autorizada. –