如何将所有 C# 8 可空引用警告视为错误?

Posted

技术标签:

【中文标题】如何将所有 C# 8 可空引用警告视为错误?【英文标题】:How to treat ALL C# 8 nullable reference warnings as errors? 【发布时间】:2020-01-31 08:20:21 【问题描述】:

使用 Visual Studio 2019 v16.3.2,将 .NET Core 3.0 项目设置为 C# 8 并启用可为空的引用类型。

<PropertyGroup>
    <TargetFramework>netcoreapp3.0</TargetFramework>
    <LangVersion>8.0</LangVersion>
    <Nullable>enable</Nullable>
</PropertyGroup>

如果我将其设置为将所有警告视为错误:

<TreatWarningsAsErrors>true</TreatWarningsAsErrors>
<WarningsAsErrors />

它将其他警告报告为错误。例如,CS0168 The variable 'x' is declared but never used 报告为错误。但是所有可以为空的引用警告仍然报告为警告。例如,CS8600 Converting null literal or possible null value to non-nullable type. 仍会报告为警告。

我如何将所有可空引用警告视为错误?

注意:即使将 CS8600 专门设置为错误处理也不会导致它被报告为错误。如果这行得通,那么将它们全部视为错误仍然无济于事,因为它们太多了。

编辑:将特定警告设置为被视为错误会将&lt;WarningsAsErrors&gt;CS8600;CS8602;CS8603&lt;/WarningsAsErrors&gt; 放入 csproj 中并且不起作用。

【问题讨论】:

尝试将 CS8600;CS8602;CS8603 添加到 csproj 我认为你的 VS 有问题。相同的配置对我有用。请尝试重新安装你的VS 您是在构建项目以获得这些警告/错误,还是在编辑器窗口中出现问题?在代码窗口中运行的编译器似乎存在很多同步问题,但它应该无法通过实际的构建过程。 @officer 的回答指出了您正在寻找的内容。它应该被接受为这里的答案。 【参考方案1】:

现在可以将所有与 nullable 相关的警告视为错误,而无需明确指定它们。为此,您必须在 *.csproj 文件中设置 &lt;WarningsAsErrors&gt;Nullable&lt;/WarningsAsErrors&gt; [source]。

完整示例:

<Project Sdk="Microsoft.NET.Sdk.Web">
  <PropertyGroup>
    <TargetFramework>netcoreapp3.1</TargetFramework>
    <Nullable>enable</Nullable>
    <WarningsAsErrors>Nullable</WarningsAsErrors>
  </PropertyGroup>
</Project>

【讨论】:

小心。您将不得不使用假 init = null!; 处理所有非空属性有没有办法添加所有然后排除某些属性? 问题是明确将 all 可以为空的警告视为错误。 @SerjG 除此之外,我在现有代码库中引入可为空功能的方法是对新的/更改的文件使用#nullable enable pragma。另一种方法可能是全局启用它,但使用#nullable disable 选择退出您的特殊文件。 不确定 ` = null!` 对所有烦人的地方有何帮助! @SerjG:我不明白:你为什么会有这样的属性?它要么可以为空,要么不能,然后必须以某种方式初始化它,直接在其声明中或在构造函数中或通过在构造函数中调用的辅助方法(使用属性MemberNotNull)或通过惰性初始化如果允许清除缓存值并在下一次 getter 调用时重新创建它,则该属性不可为空,并且 setter 的属性为 AllowNull(但在属性上声明)。【参考方案2】:

问题在于.editorconfig 文件覆盖了 Visual Studio 设置,将所有警告视为错误,其中包含许多行,例如:

dotnet_diagnostic.CS8602.severity = warning

这会强制 CS8602 成为警告。

这是怎么发生的:在之前尝试将所有可为空的引用警告变成错误时,我在编辑器配置中将其中的许多设置为错误。在那里,我发现有大量不同的警告编号,而且我的代码库还没有准备好让它们在整个解决方案中成为错误。所以我在编辑器配置中将它们设置为“警告”,因为我不想丢失我找到的警告列表。后来,我忘记了这一切,决定逐个项目打开将警告视为错误。

【讨论】:

@MindSwipe 不,其他 C# 8 功能可以正常工作。是什么让你产生了这个想法?我从没说过。【参考方案3】:

我建议使用this 解决方案。 它提到了所有 3 个错误和恕我直言更好的解决方案

<Project Sdk="Microsoft.NET.Sdk">
  <PropertyGroup>
    <OutputType>Exe</OutputType>
    <TargetFramework>netcoreapp3.1</TargetFramework>
    <LangVersion>8.0</LangVersion>
    <WarningsAsErrors>CS8600;CS8602;CS8603</WarningsAsErrors>
  </PropertyGroup>
</Project>


更新:

我们现在有这个列表: &lt;WarningsAsErrors&gt;CS8600;CS8601;CS8602;CS8603;CS8613;CS8625;CS8629;CS8614;CS8619;CS8633&lt;/WarningsAsErrors&gt;

2021-04 更新:

我们现在有这个列表: &lt;WarningsAsErrors&gt;CS8600;CS8601;CS8602;CS8603;CS8604;CS8613;CS8614;CS8619;CS8620;CS8622;CS8625;CS8629;CS8633,CS8767&lt;/WarningsAsErrors&gt;

【讨论】:

关于您的更新:也许CS8618 C# Non-nullable property is uninitialized. Consider declaring the property as nullable. 也可能与包含相关。 @officer 这是我们试图避免的所有 DTO、模型和其他永远不会使用 new() 创建的类

以上是关于如何将所有 C# 8 可空引用警告视为错误?的主要内容,如果未能解决你的问题,请参考以下文章

如何将 C# 8.0 可空引用类型与 Entity Framework Core 模型一起使用?

C# 8.0 可空(Nullable)给ASP.NET Core带来的坑

C# 8中的可空引用类型

C#的未来:简化参数空值验证

可空类型产生警告,因为项目已启用可空引用类型

有没有一种方便的方法来过滤一系列 C# 8.0 可空引用,只保留非空值?