如何升级到 C# 5.0?访问修改后的闭包

本文关键字:修改 访问 闭包 何升级 | 更新日期: 2023-09-27 18:31:09

我觉得问这个有点傻。请不要用力抨击我。

最近我一直在使用.Net Framework 4.5和Visual C# 2012以及C# 5.0之前的编译器;以及Visual Studio 2012。

我开始使用任务,并对Resharper的"访问修改后的关闭"通知感到恼火。然后我读到,如果我升级到 .Net Framework 4.5.2 并升级到 C# 5.0 后,它会"修复"forforeach,这样我就不必在循环的大括号内创建一个临时变量,因为共享上下文。

所以我认为很棒,这将是一个容易解决的问题。我做了以下工作:

1)检查我是否正在使用Visual Studio 2012,并且它与新的4.5.2框架和C# 5.0兼容(此处)

2)然后我下载并安装了.Net 4.5.2的开发人员版本(此处)

3) 然后,我将解决方案中的每个项目定位为 .Net 4.5.2 而不是 .Net 4.5。我重建,运行我的单元测试,并获得了所有绿灯。

4)然后我转到任务代码,并尝试删除临时变量。瞧,它仍然警告我访问修改后的关闭;例如:

    int numTasks = 1000;
    var tasks = new Task<int>[numTasks];
    for (int i = 0; i < numTasks; i++)
        tasks[i] = Task.Delay(1).ContinueWith(a => i); // <-- warning

由于共享上下文,上面的代码将生成错误的输出。对于 .Net 4.5 和 C# 5.0 之前,解决此问题的方法是引入如下所示的临时变量:

    int numTasks = 1000;
    var tasks = new Task<int>[numTasks];
    for (int i = 0; i < numTasks; i++)
    {
        int i1 = i;
        tasks[i] = Task.Delay(1).ContinueWith(a => i1); <-- no warning, works great
    }

当然,我不喜欢这样,因为它很丑陋,必须评论让我的同事理解。我宁愿使用新版本的C#和.Net框架。

我接下来想,"如何检查Visual Studio 2012是否安装和使用了C# 5.0?这就是我卡住的地方。我的Visual Studio 2012环境似乎仍在使用C# 4.5。我证明了这一点,即在执行上面列出的升级步骤后,访问修改后的关闭问题没有解决。

有人可以帮助我了解如何摆脱对修改后的闭包的访问****问题,希望通过升级到 C# 5.0(如果这确实是我的问题)。

谢谢

如何升级到 C# 5.0?访问修改后的闭包

警告是完全正确的。 您正在关闭稍后修改的变量。 您提供的示例代码在 C# 4.0 和 C# 5.0(或 C# 3.0 或 C# 6.0)中的行为没有什么不同。

在 C# 5.0 中,只更改了foreach循环,以便在每次迭代时重新创建循环变量。 for循环没有变化,闭包的语义也没有改变。