In this answer https://stackoverflow.com/a/8649429/1497 Eric Lippert says that “FYI we are highly likely to fix this in the next version of C#; this is a major pain point for developers” with regards to how the foreach loops uses the variable.
In the next version each time you run through the “foreach” loop we will generate a new loop variable rather than closing over the same variable every time. This is a “breaking” change but in the vast majority of cases the “break” will be fixing rather than causing bugs.
I have not been able to find anything indicating that this change has been made yet. Is there any indication that this is how the foreach loop will work in C# 5?
This is a change to the C# language, not the .NET framework. Therefore, it only affects code compiled under C# 5.0, regardless of the .NET framework version on which that code will execute.
C# 5.0
Section 8.8.4 of the specification makes it clear that this change has been made. Specifically, page 249 of the C# 5.0 specification states:
And later:
C# 4.0
This change to the specification is clear when comparing with the C# 4.0 specification which states (again, in section 8.8.4, but this time, page 247):
Note that the variable
vis declared outside the loop instead of inside, as it is with C# 5.0.Note
You can find the C# specification in the installation folder of Visual Studio under
VC#\Specifications\1033. This is the case for VS2005, VS2008, VS2010 and VS2012, giving you access to specifications for C# 1.2, 2.0, 3.0, 4.0 and 5.0. You can also find the specifications on MSDN by searching forC# Specification.