C# 6.0 if语句中null-conditional运算符逻辑及编译问题咨询
空条件运算符(?.)在if语句中的逻辑解析
核心基础规则
- 空条件运算符
?.的行为逻辑为:如果左侧操作数为null,整个表达式直接返回对应类型的空值,不会执行右侧的成员访问操作;如果左侧不为null,才会正常执行右侧操作。- 如果右侧成员返回的是值类型
T,整个表达式返回Nullable<T>(可空值类型)的空值 - 如果右侧成员返回的是引用类型,整个表达式返回引用类型的
null
- 如果右侧成员返回的是值类型
第一段代码运行逻辑说明
你给出的代码:
List<string> items = null; if (items?.Count == 0) { Console.WriteLine("error"); } else { Console.WriteLine("OK"); }
这段代码运行输出OK的原因:
items为null,因此items?.Count的结果是int?类型的空值- C#支持可空值类型与对应非可空值类型直接做相等比较,
int?类型的空值和int类型的0比较,结果为false - 判定结果为
false,因此进入else分支输出OK - 整个
items?.Count == 0表达式的最终返回值是纯bool类型,符合if语句的条件要求,因此可以正常编译。
第二段代码编译失败的原因
if (items?.Any())无法编译和它是方法还是属性没有任何关系,核心原因如下:
Any()方法返回值为bool类型,因此items?.Any()的结果是bool?(可空布尔)类型- C#的
if条件仅接受纯bool类型的输入,bool?存在三种可能取值:true、false、null,无法隐式转换为bool,因此直接放到if条件中会触发编译错误。
为什么items?.Count() == 0可以正常编译
items?.Count()返回的是int?类型,后续和0做相等比较的操作,最终返回的结果是纯bool类型,符合if条件的类型要求,因此可以正常编译。
解决方案
如果要在if条件中搭配?.和Any()使用,可以手动将bool?转换为纯bool,常见写法有两种:
// 写法1:显式和true做判等 if (items?.Any() == true) { // 业务逻辑 } // 写法2:通过空合并运算符指定null时的默认返回值 if (items?.Any() ?? false) { // 业务逻辑 }
内容的提问来源于stack exchange,提问作者David
相关产品推荐
相关产品推荐

