请问 C# 中判断可空布尔类型变量值的正确姿势是什么?
如果直接判断( bool? isOk; if (isOk) ; )会出现下面的错误提示:
Cannot implicitly convert type 'bool?' to 'bool'
闲来无事答一答题。
答案如下:
bool? success = null; if(success.GetValueOrDefault()){ //TODO: do what you want. }
原因:其实翻看 Nullable<T> 的源码就应该知道,T 的约束是 struct(其实这应该算常识),对应的当类型为 Nullable<T> 的变量被“赋值”为null时, GetValueOrDefault() 返回的值实际上 等于 default(T) ,原因是 bool? success = null; 实际上对应的代码是 bool? success = new Nullable<bool>();//所有结构都有一个默认无参数的构造函数。 (编译器的功劳哦)。
当 bool? success = 后面跟的是一个编译时无法确定是否为 null 的表达式时,编译器会生成一个 if else 语句,判断表达式运行的值,如果为 null 跟上面的一样,调用默认无参数的构造函数,如果不为 null,则调用 public Nullable(T value) 有参构造函数。
这样写行不行?
bool result=isOK.HasValue?(bool)isOK:false;
if(isOk ?? false)
if(isOk.HasValue && isOk.Value)
参考:https://stackoverflow.com/questions/22680391/cannot-implicitly-convert-type-bool-to-bool-an-explicit-conversion-exists
笨方法
bool? IsBool; if (IsBool!=null) { xxxxxxxx; }
if(isOk.HasValue|isOk.Value)
bool? isOk; if (isOk) 这边可能为空
bool isOK ;if(isOk) 应该没问题