使用带注释的扩展方法时取消引用可能为空的引用

问题描述 投票:0回答:1

我有以下

IsNotNull
的扩展方法,它工作正常,但在使用它时我收到警告,可能有
null
引用,我正在尝试找出如何删除该警告
Dereference of a possibly null reference

方法

    [ContractAnnotation("obj:null => false")]
    public static bool IsNotNull(this object obj)
    {
        return obj != null;
    }

我试图删除的黄线

enter image description here


注:

我知道

!
并且可以用它来抑制警告,但我正在尝试找出“正确的方法”

    if (actions.IsNotNull())
    {
        actions!.Invoke(builder);
    }
c# .net-core annotations nullreferenceexception
1个回答
0
投票

解决此问题的几种方法

选项一:通知编译器您的可为空性检查。

C# 编译器不够智能,无法研究

IsNotNull
的工作原理。它不知道当你返回 false 时,
obj
不能为空。您可以应用可空静态分析属性来通知编译器。

public static bool IsNotNull([NotNullWhen(false)] this object? obj)
{
    return obj != null;
}

[NotNullWhen(false)]
,应用于参数,让C#编译器明白,返回
false
意味着
obj
不为空。

选项二:为什么你还需要

IsNotNull
方法?

如所写,

IsNotNull
是相当基础的。坚持自己进行可空性检查可能会更容易。

if (actions is not null)
{
    actions.Invoke(builder);
}

选项三:有条件地运行调用

最后,使用

?.
运算符可以节省大量时间。这将在
Invoke()
对象上运行
actions
方法,但仅当 actions 对象不为 null 时才运行。
// there is no "if" around this code, nor any need for IsNotNull()
actions?.Invoke(builder);

	
© www.soinside.com 2019 - 2024. All rights reserved.