当 C# 使用不能为 null 的参数调用我的方法时避免警告

Avoid warnings when C# calls my methods with arguments that cannot be null

我已阅读 docs C# 可空引用类型。

我不确定如何处理框架调用我的方法的情况。

一个简单的 EF Core 示例:

protected override void OnModelCreating(ModelBuilder builder) 
{
     base.OnModelCreating(builder);
     builder.ApplyConfiguration(new CustomerConfiguration());    // <--- CA1062
}

这会引发警告 CA1062:

In externally visible method 'void DbContext.OnModelCreating(ModelBuilder builder)', validate parameter 'builder' is non-null before using it. If appropriate, throw an ArgumentNullException when the argument is null or add a Code Contract precondition asserting non-null argument. csharp(CA1062)

我假设框架不会向我发送 null,所以我认为检查 null 没有意义。

我该如何处理这种情况,即:框架使用不能为空的参数调用我的方法?

编辑:我的问题与链接的问题不同,因为它是通用的,专门询问 C# 8 的 NRT 功能。我只选择了一个相关的例子。无论如何感谢所有帮助过的人。

根据我的评论,如果 builder 不是 null,您可以使用 null-conditional operator ?. 仅调用 ApplyConfiguration 方法:

builder?.ApplyConfiguration(new CustomerConfiguration());?

来自文档:

A null-conditional operator applies a member access, ?., or element access, ?[], operation to its operand only if that operand evaluates to non-null; otherwise, it returns null.

根据评论中的讨论进行编辑

我认为包含一个 OP 已经知道的替代方案是有意义的,但我将展示一个更全面的解决方案。

而不是使用空条件运算符(这实际上会隐藏任何问题是 builder 实际上是 null),只需在方法开始时测试 builder

protected override void OnModelCreating(ModelBuilder builder) {
    if (builder == null) throw new ArgumentNullException(nameof(builder));
    base.OnModelCreating(builder);
    ...

这将是处理 nullbuilder 的更全面的方法,因为如果您收到 null进入方法。

另一个选项是禁用诊断 CA1062,如果您认为该规则不会在您的方案中增加任何价值。

您可以在不同级别以不同方式禁用诊断。使用 .editorconfig 文件应用于磁盘上的给定子树。使用 #pragmaGlobalSuppressions.cs 隐藏代码中的特定区域。