我有以下
IsNotNull
的扩展方法,它工作正常,但在使用它时我收到警告,可能有 null
引用,我正在尝试找出如何删除该警告 Dereference of a possibly null reference
。
[ContractAnnotation("obj:null => false")]
public static bool IsNotNull(this object obj)
{
return obj != null;
}
我试图删除的黄线
我知道
并且可以用它来抑制警告,但我正在尝试找出“正确的方法”!
if (actions.IsNotNull())
{
actions!.Invoke(builder);
}
解决此问题的几种方法
选项一:通知编译器您的可为空性检查。
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);