如何升级到C#5.0?使用修改后的闭包
问这个我觉得有点傻。请不要用力打我 最近,我一直在使用.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) 然后我转到任务代码,并尝试删除临时变量。瞧,它仍然警告我关于访问修改后的闭包;例如:如何升级到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进行了“修复”,这样我就不必因为共享上下文而在循环的方括号内创建临时变量 所以我觉得很好,这将是一个简单的解决办法。我做了以下几
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
}