如何处理空值?解决Supplier_Type为null时的if语句异常
问题:空值导致的条件判断异常处理
我写了下面的if语句:
if ((product.EmailType.Contains("cafe", StringComparison.OrdinalIgnoreCase) || product.EmailType.Contains("vendor", StringComparison.OrdinalIgnoreCase)) && product.Supplier.Supplier_Type.Contains("Support")) { // 执行操作 }
逻辑是:当EmailType包含"cafe"或"vendor"(不区分大小写),且Supplier_Type包含"Support"时执行对应操作。
但实际场景中Supplier_Type经常为null,导致代码抛出空引用异常。我希望只要Supplier_Type是null,整个if条件就判定为false,直接跳过操作。
我尝试用空合并运算符处理,结果报了这个错误:
Operator ?? cannot be applied to type bool and bool
尝试的代码如下:
if ((product.EmailType.Contains("cafe", StringComparison.OrdinalIgnoreCase) || product.EmailType.Contains("vendor", StringComparison.OrdinalIgnoreCase)) && (product.Supplier.Supplier_Type.Contains("Support") ?? false)) { // 执行操作 }
还试了下面的空值处理写法,同样报上面的错误:
&& product.Supplier.Supplier_Type?.Contains("Support")
解决方案
问题根源在于:
- 直接调用
product.Supplier.Supplier_Type.Contains("Support")时,如果Supplier_Type为null,会直接抛出空引用异常,根本走不到空合并运算符的逻辑。 - 而
product.Supplier.Supplier_Type?.Contains("Support")返回的是bool?(可空布尔类型),但&&运算符要求两边都是bool类型,所以直接用会类型不匹配。
给你两种可行的解决写法:
写法一:短路判空(推荐,逻辑直观)
if ((product.EmailType.Contains("cafe", StringComparison.OrdinalIgnoreCase) || product.EmailType.Contains("vendor", StringComparison.OrdinalIgnoreCase)) && product.Supplier.Supplier_Type != null && product.Supplier.Supplier_Type.Contains("Support")) { // 执行操作 }
利用&&的短路求值特性:如果前面的product.Supplier.Supplier_Type != null为false,后面的Contains方法不会被执行,直接返回false,避免了空引用异常。
写法二:可空布尔值转普通布尔值
if ((product.EmailType.Contains("cafe", StringComparison.OrdinalIgnoreCase) || product.EmailType.Contains("vendor", StringComparison.OrdinalIgnoreCase)) && (product.Supplier.Supplier_Type?.Contains("Support") ?? false)) { // 执行操作 }
这里?.运算符会先判断Supplier_Type是否为null:
- 如果是null,返回
null(类型为bool?); - 如果不为null,返回
Contains方法的执行结果(bool类型)。
再通过?? false把null转换成false,最终整个表达式的结果是bool类型,符合&&的要求。
内容的提问来源于stack exchange,提问作者jmk
相关产品推荐
相关产品推荐

