【问题标题】:Why are warnings CS0108 & CS0114 *NOT* errors by default in Visual Studio?为什么 Visual Studio 中默认出现警告 CS0108 和 CS0114 *NOT* 错误?
【发布时间】:2020-02-23 04:17:15
【问题描述】:

当一个变量被声明为与基类中的一个变量同名时,警告 CS0108 触发。
警告 CS0114 等同于方法。

两者都标记为警告而不是错误。编译继续,可执行文件可以运行了。

但风险在于调用错误的逻辑错误或错误。

这在现场制作环境中非常危险。

在调试时也非常“不明显”:代码在单步执行时看起来像是在做正确的事情,但实际上并非如此。在高度抽象/继承的代码库中识别该错误可能需要很长时间。

“new”关键字的存在肯定是有原因的,而且(更确切地说)应该通过编译错误来强制使用 - 而不仅仅是警告。

但事实并非如此。您必须在解决方案中的每个项目上手动设置它;甚至不可能在解决方案范围内强制执行。

而且我还没有找到一种方法将其作为新解决方案的默认行为。

为什么?

【问题讨论】:

  • But the risk is a logic error or bug where the wrong one is invoked. 风险不一定与错误相同。因此,为什么要警告而不是错误。另外,一旦您将其定义为警告,那么根据定义您已经声明它是可以接受的。如果他们将其默认更改为错误(对于所有客户)用于编译的代码将停止编译。
  • 与许多其他警告不同(如果您不及早开始清理,项目很快就会达到 1000 条警告),这些警告始终会产生不良行为,至少对我和在当前的项目。今天我第 n 次点击它并决定用 google-stackoverflow-solve 解决它——我现在很高兴在未来消除了另一个无法言喻的错误和痛苦的来源。

标签: c# visual-studio compiler-errors compiler-warnings


【解决方案1】:

您实际上可以将警告设置为错误解决方案范围(种类)。唯一的限制是解决方案必须在顶级目录中。

您可以在解决方案旁边添加一个 Directory.Build.targets 文件,以设置将警告视为错误。该文件将自动加载并在构建过程中使用(请参阅文档中的更多内容:https://docs.microsoft.com/en-us/visualstudio/msbuild/customize-your-build?view=vs-2019#directorybuildprops-and-directorybuildtargets

<Project>
  <PropertyGroup>
    <WarningsAsErrors>$(WarningsAsErrors);CS0108;CS0114</WarningsAsErrors>
  </PropertyGroup>
</Project>

至于为什么默认情况下它是警告而不是错误(我的想法):错误是破坏构建并且您无法编译项目/解决方案的事情,而警告是警告用户潜在的错误.

【讨论】:

    【解决方案2】:

    默认情况下,Visual Studio 将导致程序无法编译的所有内容都视为错误。由于这些注意事项不会影响编译,而只会影响代码的质量,因此它们被视为警告。但正如 Styxxy 所指出的,您可以将任何您喜欢的警告视为错误。

    【讨论】:

    • 哦,当然,我明白了。但是有一个不一致的地方:newoverride 关键字在 C# 语言中是有原因的;编译器没有强制正确使用似乎很奇怪。因此,我认为它们的缺失会导致编译错误。在任何情况下,我都无法预见您希望这种歧义存在的有用情况。已接受,现在引入它可能会破坏旧代码 - 但谁不想进行此修复?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-11
    • 2013-04-24
    • 2017-04-17
    • 1970-01-01
    • 1970-01-01
    • 2010-09-10
    相关资源
    最近更新 更多