L’uso delle variabili di foreach è stato modificato in C # 5?

In questa risposta https://stackoverflow.com/a/8649429/1497 Eric Lippert dice che “FYI è molto probabile che risolviamo questo problema nella prossima versione di C #, questo è un punto critico per gli sviluppatori” riguardo a come foreach loop usa la variabile.

Nella prossima versione ogni volta che si esegue il ciclo “foreach” genereremo una nuova variabile di ciclo anziché chiudere la stessa variabile ogni volta. Questo è un cambiamento “di rottura”, ma nella stragrande maggioranza dei casi la “rottura” si risolverà invece di causare bug.

Non sono stato in grado di trovare nulla che indichi che questo cambiamento è stato ancora apportato. C’è qualche indicazione che questo è il modo in cui il ciclo foreach funzionerà in C # 5?

Questa è una modifica al linguaggio C #, non al framework .NET. Pertanto, riguarda solo il codice compilato in C # 5.0, indipendentemente dalla versione del framework .NET su cui verrà eseguito quel codice.

C # 5.0

La sezione 8.8.4 delle specifiche chiarisce che questa modifica è stata apportata. In particolare, la pagina 249 della specifica C # 5.0 indica:

 foreach (V v in x) embedded-statement 

viene quindi esteso a:

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

E più tardi:

Il posizionamento di v all’interno del ciclo while è importante per il modo in cui viene catturato da qualsiasi funzione anonima presente nell’istruzione embedded.

C # 4.0

Questa modifica alla specifica è chiara quando si confronta con la specifica C # 4.0 che afferma (di nuovo, nella sezione 8.8.4, ma questa volta, pagina 247):

 foreach (V v in x) embedded-statement 

viene quindi esteso a:

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

Si noti che la variabile v è dichiarata all’esterno del ciclo anziché all’interno, come nel caso di C # 5.0.

Nota

È ansible trovare le specifiche C # nella cartella di installazione di Visual Studio in VC#\Specifications\1033 . Questo è il caso di VS2005, VS2008, VS2010 e VS2012, che consente l’accesso alle specifiche per C # 1.2, 2.0, 3.0, 4.0 e 5.0. È anche ansible trovare le specifiche su MSDN cercando la specifica C# Specification .