You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何?.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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 06:21:38