在这种应答https://stackoverflow.com/a/8649429/1497埃里克利珀说:“FYI,我们极有可能在C#中的下一个版本,以解决这个问题,这是一个重大的痛点为开发商”,与如何foreach循环使用变量。
在接下来的版本每次通过“foreach”循环运行时,我们将产生一个新的循环变量,而不是在同一个变量,每次关闭。 这是一个“破”的变化,但在绝大多数情况下的“突破”将被固定,而不是造成错误。
我一直没能找到任何表明这种变化尚未作出。 是否有任何迹象表明这是foreach循环是如何工作在C#5?
这是一个变化的C#语言,而不是.NET框架。 因此,它不仅影响在C#5.0编译代码,无论.NET Framework版本上的代码将被执行。
C#5.0
该规范第8.8.4明确指出,这种变化已经取得进展。 具体而言,C#5.0规范规定的249页:
foreach (V v in x) embedded-statement
然后扩展到:
{
E e = ((C)(x)).GetEnumerator();
try {
while (e.MoveNext()) {
V v = (V)(T)e.Current;
embedded-statement
}
}
finally {
… // Dispose e
}
}
然后:
while循环中v的位置是因为它是如何在嵌入语句中出现的任何匿名函数捕获重要。
C#4.0
与C#4.0规范该条规定(同样,在第8.8.4,但是这一次,第247页)进行比较时,这种变化的规范是明确的:
foreach (V v in x) embedded-statement
然后扩展到:
{
E e = ((C)(x)).GetEnumerator();
try {
V v;
while (e.MoveNext()) {
v = (V)(T)e.Current;
embedded-statement
}
}
finally {
… // Dispose e
}
}
注意变量v
被声明的循环,而不是内部的外面,因为它是用C#5.0。
注意
你可以找到在Visual Studio下的安装文件夹的C#规范VC#\Specifications\1033
。 这是VS2005,VS2008,VS2010和VS2012的情况下,让您获得规格为C#1.2,2.0,3.0,4.0和5.0。 您也可以通过搜索找到MSDN上的规格C# Specification
。