在C#5中,foreach是否使用了variables?

在这个答案https://stackoverflow.com/a/8649429/1497 Eric Lippert说:“仅供参考,我们很可能解决这个在下一个版本的C#;这是一个开发人员的主要痛点”关于如何foreach循环使用variables。

在下一个版本中,每次运行“foreach”循环时,我们都会生成一个新的循环variables,而不是每次都closures同一个variables。 这是一个“突破”的变化,但在绝大多数情况下,“突破”将是修复而不是造成错误。

我还没有find任何表明这个改变已经完成的东西。 有没有任何迹象表明这是foreach循环如何在C#5中工作?

这是对C#语言的改变,而不是.NET框架。 因此,它只影响在C#5.0下编译的代码,无论代码将在哪个.NET框架版本上执行。

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 } } 

然后:

v在while循环中的位置对于embedded语句中发生的任何匿名函数如何捕获都很重要。

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 } } 

请注意,variablesv是在循环内部而不是内部声明的,因为它与C#5.0一样。

注意

您可以在VC#\Specifications\1033下的Visual Studio的安装文件夹中findC#规范。 这是VS2005,VS2008,VS2010和VS2012的情况,您可以访问C#1.2,2.0,3.0,4.0和5.0的规范。 您也可以通过searchC# SpecificationfindMSDN上的C# Specification