在.NET 3.5和4.5中LINQ查询结果的差异

10 浏览
0 Comments

在.NET 3.5和4.5中LINQ查询结果的差异

这个问题已经有了答案:

在C#中循环语句中变量重用的原因是什么?

我用 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日
0
0 Comments

您在闭包中访问了一个变量,因此不同版本的编译器的结果将不同。

在C# 5.0中,变量在每次循环迭代中被重新定义,而在以前的C#版本中,它只被定义一次。

更多信息,请参见Eric Lippert的 优秀博文

更值得注意的是,引言部分:

更新:我们正在采取破坏性变化。在C# 5中,foreach循环的循环变量将逻辑上位于循环内部,因此闭包将每次都使用一个新的变量副本。 "for"循环将不会改变。现在我们返回原始文章。

0
0 Comments

从C# 5开始,在foreach中的循环变量编译成存在循环范围内而不是外部范围。

这意味着当你关闭循环变量时,你会得到不同的结果。

这里是Eric Lippert对原始问题的看法。

0