.NET 3.5 和 4.5 中 LINQ 查询结果的差异 [重复]

Posted

技术标签:

【中文标题】.NET 3.5 和 4.5 中 LINQ 查询结果的差异 [重复]【英文标题】:Difference in LINQ query results in .NET 3.5 and 4.5 [duplicate] 【发布时间】:2013-09-09 11:58:48 【问题描述】:

我使用 C# 3.5 和 4.0 执行了以下代码。结果完全不同。

    static void Main()
           
        int[] numbers =  1, 2, 3, 4, 5, 6, 7, 8, 9, 10 ;
        List<IEnumerable<int>> results = new List<IEnumerable<int>>();

        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 编译器版本 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,还添加了编译器版本 请解释一下。

【问题讨论】:

我在 3.5 和 4.0 中得到相同的输出, 9 8 7 ... 你确定你没有做不同的事情吗? 它给了我同样的结果.... 我相信这种变化发生在 4.5,而不是 4.0。 @JoeEnos 跟.NET的版本无关,跟使用的C#版本有关。 @Servy 明白了,谢谢。有时很难明确这些区别。 【参考方案1】:

您访问了闭包内的变量,因此不同版本的编译器的结果会有所不同。

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

有关详细信息,请参阅 Eric Lippert 的伟大 blog post

更值得注意的是,开头段落:

更新:我们正在进行重大更改。在 C# 5 中,foreach 的循环变量在逻辑上将位于循环内部,因此闭包每次都会关闭变量的新副本。 “for”循环不会改变。我们现在让您回到我们的原始文章。

【讨论】:

变量的作用域与 .NET 的版本无关。它与 C# 的版本有关。它在 C# 5.0 中进行了更改。 你看过eric的博客We are taking the breaking change. In C# 5 @Servy 是的,我已经澄清了,谢谢。 是的,在使用 .NET 3.5 编译的 VS2012 中,它可以完美运行。 @AlessandroD'Andria 那是因为您使用的是 C# 5.0 编译器。使用的 .NET 版本无关紧要。【参考方案2】:

从 c# 5 开始,foreach 中的循环变量被编译为存在于循环范围内而不是循环范围之外。

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

Here's what Eric Lippert不得不说原来的问题。

【讨论】:

从 C# 5.0 开始,而不是 .NET 4.0。 这不能回答问题。 OP 在 c# 4.0 中询问。但是你正在使用 c# 5.0 OP 询问 .net4。这是观察到的结果的唯一可能性。 为了兼容性使用 var t = num;在 foreach 循环中。 @SriramSakthivel 刚刚测试过,你是对的。

以上是关于.NET 3.5 和 4.5 中 LINQ 查询结果的差异 [重复]的主要内容,如果未能解决你的问题,请参考以下文章

VS2022 安装.NET 3.5/.NET 4/.NET 4.5/.NET 4.5.1目标包的方法

c# .net 3.5 4.0 4.5 5.0 6.0各个版本新特性战略规划总结转载

使用 .NET 3.5 生成的 exe 文件无法加载使用 .NET 4.5 创建的 dll?

我可以将 Windows Identity Foundation 3.5 与 .NET 4.5 一起使用吗?

对于连接到 .NET 4.5 服务器应用程序的 .NET 3.5 客户端应用程序,我应该使用哪个版本的 Fiddler?

WiX 在具有 .NET 3.5 的机器上安装 .NET 4.5,但不在具有 .NET 4.0 的机器上