避免在 C# 使用不能为 null 的参数调用我的方法时发出警告 在评论中编辑以下讨论

问题描述

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

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

一个简单的 EF Core 示例:

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

这会引发警告 CA1062:

在外部可见方法“void DbContext.OnModelCreating(ModelBuilder builder)”中,使用前验证参数“builder”是否为非空。如果合适,当参数为空时抛出 ArgumentNullException 或添加一个代码契约前提条件断言非空参数。 csharp(CA1062)

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

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

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

解决方法

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

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

来自文档:

空条件运算符应用成员访问、?. 或元素 访问,?[],仅当该操作数求值时对其操作数进行操作 非空;否则返回null。

在评论中编辑以下讨论

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

与其使用空条件运算符(它实际上会隐藏任何问题,因为 builder 实际上是 null),只需在方法的开头测试 builder

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

这将是处理 nullbuilder 的更全面的方法,因为如果您收到 nullmalloc()方法。

,

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

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