c# - 根据教科书,委托(delegate)循环不会更改 C# 5 和 C# 4 版本之间的行为

标签 c#

我有另一个相当不重要的理论问题,但我希望无论如何都能弄清楚这个问题。根据我的教科书,它指出以下代码从 C# 版本 4 到 C# 版本 5 应该有不同的结果:

    static void Main(string[] args)
    {
        var values = new List<int> { 10, 20, 30 };
        var funcs = new List<Func<int>>();
        foreach (var value in values)
        {
            funcs.Add(() => value);
        }
        foreach(var f in funcs)
        {
            Console.WriteLine((f()));
        }
        Console.ReadKey();
    }

根据我掌握的资料,在C#版本4中,由于以下原因,30应该写入控制台3次:

With C# 4 the compiler defines the loop variable outside of the while loop and reuses it with every iteration. Thus, at the end of the loop the variable has the value from the last iteration.

在 C# 5 中,值 10、20、30 应该写入控制台,尽管更改了 C# 版本(我肯定是在更改语言版本而不是 .NET 框架(尽管我已经尝试过以及))两个版本都将 10、20、30 写入控制台。

我意识到这不是很重要,但我只是想知道为什么会这样,因为它可能是我做错的事情并且可能影响我在 C# 语言版本之间尝试的其他测试。

最佳答案

细节决定成败 - 正如您正确引用的那样,旧行为仅发生在 C# 4 编译器 中,而不是语言或框架本身。

因此,一切都取决于您用来编译代码的环境(即 Visual Studio),而不管选择的语言兼容性级别或目标框架版本如何。

关于c# - 根据教科书,委托(delegate)循环不会更改 C# 5 和 C# 4 版本之间的行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36233868/

相关文章:

c# - 如何在 nUnit 中对我的 asp.net mvc 应用程序的 View 和授权属性进行单元测试?

c# - 从托管代码使用非托管代码

c# - Console.Out.Write() 在哪里获取 Windows 服务?

c# - 建立与 SQL Server 的连接时出现与网络相关或特定于实例的错误。服务器未找到或无法访问。

c# - 无法反序列化包含 $ref 键的 JSON

C# List<baseClass> - 有什么方法可以在其中存储继承的类吗?

c# - 如何在 MS SQL Server 2014 中创建新的数据类型?

c# - 在 foreach 中使用 ref 的替代方案?

C# DataGridView - 透明图像

c# - 自动完成文本框在执行查询时卡住。一定有更好的办法!