Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/288.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何升级到C#5.0?使用修改后的闭包_C#_Visual Studio 2012 - Fatal编程技术网

如何升级到C#5.0?使用修改后的闭包

如何升级到C#5.0?使用修改后的闭包,c#,visual-studio-2012,C#,Visual Studio 2012,问这个我觉得有点傻。请不要用力打我 最近,我一直在使用.NETFramework4.5和Visual C#2012以及C#5.0之前的编译器;和Visual Studio 2012 我开始处理任务,并对Resharper发出的“访问修改的关闭”通知感到恼火。然后我读到,如果我升级到.Net framework 4.5.2并升级到post-C#5.0,它对和foreach进行了“修复”,这样我就不必因为共享上下文而在循环的方括号内创建临时变量 所以我觉得很好,这将是一个简单的解决办法。我做了以下几

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

最近,我一直在使用.NETFramework4.5和Visual C#2012以及C#5.0之前的编译器;和Visual Studio 2012

我开始处理任务,并对Resharper发出的“访问修改的关闭”通知感到恼火。然后我读到,如果我升级到.Net framework 4.5.2并升级到post-C#5.0,它对和foreach进行了“修复”,这样我就不必因为共享上下文而在循环的方括号内创建临时变量

所以我觉得很好,这将是一个简单的解决办法。我做了以下几件事:

1) 检查我使用的Visual Studio 2012是否与新的4.5.2框架和C#5.0()兼容

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

3) 然后,我针对解决方案中的每个项目使用.NET4.5.2而不是.NET4.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
int numTasks=1000;
var tasks=新任务[numTasks];
对于(int i=0;i任务[i]=任务。延迟(1)。继续(a=>i);//i1) 这个警告完全正确。您正在关闭稍后修改的变量。您提供的示例代码在C#4.0和C#5.0(或C#3.0或C#6.0)中的行为没有区别


在C#5.0中,只有
foreach
循环被修改,以便在每次迭代中重新创建循环变量<代码>for
循环没有改变,闭包的语义也没有改变。

我在这方面还不是专家,但我认为这是与编译器/Visual Studio相关的变化。你可能不是什么你可以随便看看的东西,你必须使用VS 2013Hmm,如果正确的代码让他们不高兴,你需要新的同事。C#v5只为foreach修复了它,而不是为。Eric Lippert有一篇关于此的很棒的博客文章,名为。当然……我应该仔细阅读。谢谢大家的快速回答。
    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
    }