.net 5编译器是否对loop-variable-closure问题发出警告?

时间:2014-08-19 09:58:04

标签: .net c#-4.0 resharper c#-5.0 fxcop

我目前正在开发一个使用.net 4的大型项目,几个月后我们很快就会转移到.net 5.我想知道.net 5编译器是否会向{{3}发出警告} 问题?除了resharper之外,fxcop / .net-5-compiler会对此发出警告吗?

我问这个的原因是因为如果我们将代码库移动到.net 5,我担心会有一个突破性的变化,所以想知道是否有一种方法(编译器,fxcop等)提前告诉这个可能是一个问题。我没有resharper因此我排除了它(更好地支持基础工具)

3 个答案:

答案 0 :(得分:3)

您似乎对C#版本和.Net版本感到困惑。最新的.Net版本是4.5,最新的C#版本是5.0。

中断更改修复仅存在于C#版本5.0中,它只影响foreach循环。作为Console explained,如果您依赖那里存在的错误,那么您只需要担心它,这是不可能的。但是,您可以安全地使用最新的.Net和旧的C#版本(即4.0)。

如果你最终使用的是C#5.0版,你就不会收到警告,因为没有什么可以警告了。该错误已得到修复,即使这是一个小的突破性变化。

答案 1 :(得分:1)

在后来的编译器中,这不是一个问题,微软已经解决了这个问题,代码将按照你最初的预期运行,而不了解细微差别。

从答案https://stackoverflow.com/a/8899347/21061 Eric Lippert陈述

  

我认为可以公平地说这一切都让人感到后悔。这是最糟糕的"陷阱之一"在C#中,我们将采取重大改变来解决它。在C#5中,foreach循环变量将在逻辑上位于循环体内,因此闭包每次都会得到一个新的副本。

所以,你不再需要担心。

答案 2 :(得分:0)

这实际上打破了生产代码的唯一方法就是你依赖循环变量在循环之外的事实。实际上这应该不会发生,因为它根本不直观。

        foreach (Button button in buttons)
            button.Click += (e, a) => Debug.WriteLine(button.Name);

这个代码将在C#4中打印每个按钮上最后一个元素的名称,而在C#5中它会在每个按钮上打印正确的名称(这实际上是我所期望的)

因此,如果您从未依赖C#4的奇怪行为,那么您的生产代码中没有重大变化(关于此更改)

要回答您的问题,编译器不会生成警告(特别是C#5.0编译器,因为不再存在问题)。而且我也不认为fxcop会对此提出警告。