2 回答
TA贡献1890条经验 获得超9个赞
这是对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
}
}
然后:
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。
TA贡献1811条经验 获得超5个赞
一个很好的例子:List<Action> list = new List<Action>(); foreach (var i in new int[] { 1, 2, 3, 4, 5 }) { list.Add(() => Console.WriteLine(i)); } foreach (var f in list) { f(); }
- 2 回答
- 0 关注
- 766 浏览
添加回答
举报