这是对 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 循环中的位置对于嵌入语句中出现的任何匿名函数如何捕获它很重要。
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
。