gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 23:16:19 26 4
gpt4 key购买 nike

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

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 值。

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

最佳答案

null 条件表达式总是有一个可以为 null 的返回类型——毕竟,它的整体结果必须是 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)

这将进入 if 的主体声明如果 myObject为空,或 myObject.MyProperty一片空白。

关于c# - 为什么使用 ConditionalAccessExpression 会改变我的扩展方法的工作方式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40971279/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com