如何将所有 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 专门设置为错误处理也不会导致它被报告为错误。如果这行得通,那么将它们全部视为错误仍然无济于事,因为它们太多了。
编辑:将特定警告设置为被视为错误会将<WarningsAsErrors>CS8600;CS8602;CS8603</WarningsAsErrors>
放入 csproj 中并且不起作用。
【问题讨论】:
尝试将现在可以将所有与 nullable 相关的警告视为错误,而无需明确指定它们。为此,您必须在 *.csproj 文件中设置 <WarningsAsErrors>Nullable</WarningsAsErrors>
[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>
更新:
我们现在有这个列表:
<WarningsAsErrors>CS8600;CS8601;CS8602;CS8603;CS8613;CS8625;CS8629;CS8614;CS8619;CS8633</WarningsAsErrors>
2021-04 更新:
我们现在有这个列表:
<WarningsAsErrors>CS8600;CS8601;CS8602;CS8603;CS8604;CS8613;CS8614;CS8619;CS8620;CS8622;CS8625;CS8629;CS8633,CS8767</WarningsAsErrors>
【讨论】:
关于您的更新:也许CS8618 C# Non-nullable property is uninitialized. Consider declaring the property as nullable.
也可能与包含相关。
@officer 这是我们试图避免的所有 DTO、模型和其他永远不会使用 new()
创建的类
以上是关于如何将所有 C# 8 可空引用警告视为错误?的主要内容,如果未能解决你的问题,请参考以下文章
如何将 C# 8.0 可空引用类型与 Entity Framework Core 模型一起使用?