为什么使用 ConditionalAccessExpression 会改变我的扩展方法的工作方式?

Why does using a ConditionalAccessExpression change how my extension method works?

我有一个如下所示的扩展方法:

public static bool DoesNotExist(this object toCheck)
{
  return toCheck == null;
}

一般我是这样用的:

if(myObject.DoesNotExist())
{
}

我有一个表达式,其中包含这样的条件访问表达式

if (myObject?.MyProperty == null)

编译器对此很满意。如果我那个表达式使用我的扩展方法,像这样:

if (myObject?.MyProperty.DoesNotExist())

然后我得到一个编译器错误

CS0266 Cannot implicitly convert type 'bool?' to 'bool'. An explicit conversion exists (are you missing a cast?)

MyProperty 的类型是我域中的某个对象,而不是 bool。

为什么会发生这种情况,我可以预防吗?

空条件表达式始终具有可为空的 return 类型 - 毕竟,如果左侧为空,则它的总体结果必须为 null

所以myObject?.MyProperty.DoesNotExist()的类型是Nullable<bool>,不能作为if语句的条件

通过与 bool 常量直接比较或使用空合并运算符可以很容易地修复:

if (myObject?.MyProperty.DoesNotExist() == true)

if (myObject?.MyProperty.DoesNotExist() ?? false)

在这两种情况下,如果 myObject 为空,执行将不会进入 if 语句的主体。如果你想要相反的行为,你可以使用:

if (myObject?.MyProperty.DoesNotExist() != false)

if (myObject?.MyProperty.DoesNotExist() ?? true)

但是,我不确定您的扩展方法是否真的有用 - 至少在这里不是。如果你只是做空比较,直接做:

if (myObject?.MyProperty == null)

如果 myObject 为 null,,那将进入 if 语句的主体myObject.MyProperty 为空。