为何空条件运算符(?.)调用返回bool的函数会报错?
问题原因解析
核心根源在于空条件运算符?.会将方法调用的结果包装为可空值类型,而C#的if语句对条件类型有严格要求:
- 当你写
a?.func()时,由于func()返回bool,?.会把结果转换成bool?(可空布尔类型)。但if语句要求条件必须是非可空的bool类型,bool?无法隐式转换为bool,因此直接放在if中会触发编译错误。 - 对于
a?.func2() == 10,func2()返回int,?.让结果变成int?(可空整数类型)。当可空整数和普通整数做相等比较时,C#会自动处理比较逻辑,最终返回一个确定的bool值(相等为true,不等为false),完全符合if的条件要求,因此可以正常运行。 - 当你写
a?.func() == true时,是将bool?类型的结果与bool类型的true做比较,这个比较的结果是明确的bool值:若a不为空且func()返回true,结果为true;若a为空或func()返回false,结果为false。这个确定的布尔值可以直接作为if的条件,所以代码能正常执行。
如果想更直接地处理bool?类型的条件,也可以用HasValue属性判断,比如if(a?.func().HasValue == true && a?.func().Value),但显然和true直接比较的写法更简洁。
内容的提问来源于stack exchange,提问作者신동철
相关产品推荐
相关产品推荐

