为什么使用 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
为空。
我有一个如下所示的扩展方法:
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
为空。