在.NET 3.5和4.5中LINQ查询结果的差异
在.NET 3.5和4.5中LINQ查询结果的差异
这个问题已经有了答案:
我用 C# 3.5 和 4.0 执行了以下代码,结果完全不同。
static void Main() { int[] numbers = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 }; List<IEnumerable> results = new List<IEnumerable>(); foreach (var num in numbers) { results.Add(numbers.Where(item => item > num)); } foreach (var r in results) { Console.WriteLine("{0}", r.Count()); } }
使用 Microsoft (R) Visual C# 2008 Compiler 版本 3.5.30729.5420,输出是 0 0 0 0 0 0 0 0 0 0
。
但是,使用 Microsoft (R) Visual C# Compiler 版本 4.0.30319.17929,输出是 9 8 7 6 5 4 3 2 1 0
。
我大概知道这是由于延迟执行或惰性求值导致的,但还没有清楚地理解它如何导致这里的不同输出。
更正:对不起,应该是 .NET 3.5 和 4.5,并添加了编译器版本
请解释一下。
admin 更改状态以发布 2023年5月21日
您在闭包中访问了一个变量,因此不同版本的编译器的结果将不同。
在C# 5.0中,变量在每次循环迭代中被重新定义,而在以前的C#版本中,它只被定义一次。
更多信息,请参见Eric Lippert的 优秀博文
更值得注意的是,引言部分:
更新:我们正在采取破坏性变化。在C# 5中,foreach循环的循环变量将逻辑上位于循环内部,因此闭包将每次都使用一个新的变量副本。 "for"循环将不会改变。现在我们返回原始文章。