收到“Merge sequential checks”提示,如何合并C#可空属性空值判断?
嗨,这个“Merge sequential checks”提示其实是在引导你用更简洁、更符合C#现代语法的空安全写法,你之前尝试a?.Prop.HasValue没成功,核心是忽略了空传播运算符返回的可空类型无法直接作为布尔条件这个点,我来给你拆解清楚:
为什么你之前的尝试失败?
a?.Prop.HasValue的本质是:如果a不为null,就返回a.Prop.HasValue(一个bool值);如果a是null,就返回null(也就是bool?类型的空值)。而if语句要求的是确定的bool类型,不能直接用bool?作为条件,所以你直接这么写会编译报错,这就是问题所在。
正确的合并写法(两种推荐方式)
方式1:模式匹配直接赋值(最优雅)
这种写法一次性完成了检查a不为null、检查Prop有值、将Prop的值赋值给res三个操作,完美符合“合并连续检查”的提示要求:
public class A { public int? Prop { get; set; } } // 优化后的判断 A a = new A(); if (a?.Prop is int res) { // 这里res已经是int类型,直接使用即可 Console.WriteLine(res); }
方式2:空传播结合null判断
用a?.Prop != null替代原来的两次检查,这个表达式完全等价于a != null && a.Prop.HasValue,因为:
- 如果
a是null,a?.Prop返回null,表达式结果为false - 如果
a不为null,a?.Prop就是a.Prop(int?类型),判断它是否不为null就等同于检查HasValue
代码示例:
if (a?.Prop != null) { // 这里可以直接取a.Prop,编译器已经知道它有值 int res = a.Prop; Console.WriteLine(res); }
额外补充:如果需要默认值的情况
如果你想在Prop没有值的时候用一个默认值,还可以用空合并运算符??,比如:
int res = a?.Prop ?? 0; // 如果a是null或者Prop无值,res取0
这样就完全解决了连续检查的问题,代码也更简洁易读啦!
内容的提问来源于stack exchange,提问作者DDan
相关产品推荐
相关产品推荐

