uso que getenumerator for array c# foreach .net-4.5 c#-5.0

que - ¿Se ha cambiado el uso de las variables por parte de Foreach en C#5?



return foreach c# (1)

Esto es un cambio en el lenguaje C #, no en el marco .NET. Por lo tanto, solo afecta al código compilado en C # 5.0, independientemente de la versión de .NET Framework en la que se ejecutará ese código.

C # 5.0

La Sección 8.8.4 de la especificación deja en claro que este cambio se ha realizado. Específicamente, la página 249 de la especificación C # 5.0 indica:

foreach (V v in x) embedded-statement

luego se expande a:

{ E e = ((C)(x)).GetEnumerator(); try { while (e.MoveNext()) { V v = (V)(T)e.Current; embedded-statement } } finally { … // Dispose e } }

Y después:

La ubicación de v dentro del ciclo while es importante para la captura de cualquier función anónima que ocurra en la instrucción incrustada.

C # 4.0

Este cambio en la especificación es claro cuando se compara con la especificación C # 4.0 que establece (nuevamente, en la sección 8.8.4, pero esta vez, en la página 247):

foreach (V v in x) embedded-statement

luego se expande a:

{ E e = ((C)(x)).GetEnumerator(); try { V v; while (e.MoveNext()) { v = (V)(T)e.Current; embedded-statement } } finally { … // Dispose e } }

Tenga en cuenta que la variable v se declara fuera del bucle en lugar de dentro, como lo es con C # 5.0.

Nota

Puede encontrar la especificación C # en la carpeta de instalación de Visual Studio en VC#/Specifications/1033 . Este es el caso de VS2005, VS2008, VS2010 y VS2012, que le da acceso a las especificaciones para C # 1.2, 2.0, 3.0, 4.0 y 5.0. También puede encontrar las especificaciones en MSDN buscando la especificación C# Specification .

En esta respuesta, https://stackoverflow.com/a/8649429/1497 Eric Lippert dice que "FYI es muy probable que solucionemos esto en la próxima versión de C #; este es un punto importante para los desarrolladores" con respecto a cómo el foreach usa la variable.

En la próxima versión cada vez que ejecute el ciclo "foreach", generaremos una nueva variable de bucle en lugar de cerrar la misma variable cada vez. Este es un cambio de "ruptura", pero en la gran mayoría de los casos el "rompimiento" será la solución en lugar de causar errores.

No he podido encontrar nada que indique que este cambio ya se haya realizado. ¿Hay alguna indicación de que así sea como funcionará el ciclo foreach en C # 5?