为何?.Any()返回nullable bool?与Count的空值运算符行为差异疑问
为什么
?.Any()会报错,而?.Count > 0却正常运行? 这问题其实是C#空条件运算符?.的特性导致的,我来给你拆解清楚:
1. 为什么Model.Products?.Cards?.Any()会返回bool?,导致报错?
空条件运算符?.的核心规则是:如果左边的引用为null,整个表达式直接返回null;否则执行右边的成员调用。
- 当
Model.Products或者Cards为null时,Model.Products?.Cards?.Any()的结果是null,对应类型是bool?(可空布尔值); - 当
Cards不为null时,才会执行Any(),返回普通的bool值。
而C#的if语句要求条件必须是非空的bool类型,不能直接使用bool?,所以编译器就会抛出Cannot convert bool? to bool的错误。
2. 为什么Model.Products?.Cards?.Count > 0能正常运行?
同样用空条件运算符来看:
Model.Products?.Cards?.Count的类型是int?(可空整数)——当Cards为null时,表达式返回null;否则返回Count的int值。
当你把int?和0比较时,C#会自动做隐式转换:把0转成int?,然后进行可空值的比较:
- 如果
Cards不为null,就用实际的Count和0比较,返回bool; - 如果
Cards为null,null > 0的结果是false(C#中可空值和非null值比较时,只要其中一方是null,结果都是false)。
所以整个表达式的结果是bool类型,完全符合if语句的要求,自然能正常运行。
3. 如何修改?.Any()的代码让它正常运行?
有两种常用的方式把bool?转换成bool:
方式一:明确判断是否为true
if (Model.Products?.Cards?.Any() == true) { }
- 当
Cards为null时,null == true的结果是false; - 当
Cards不为null时,判断Any()的结果是否为true。
方式二:使用空合并运算符??给null设置默认值
if (Model.Products?.Cards?.Any() ?? false) { }
??的作用是:如果左边的表达式不为null,就用左边的值;否则用右边的默认值;- 这里当
Cards为null时,表达式返回false,刚好符合if的要求。
内容的提问来源于stack exchange,提问作者Pete
相关产品推荐
相关产品推荐

