bool? 可空类型可以包含三个不同的值:true、false 和 null。它们本身不能用于条件语句,如 if、for 或 while。例如,下面的代码编译失败,并将报告编译器错误 CS0266:
bool? b = null;
if (b) // Error CS0266.
{
} 这是不允许的,因为 null 在条件上下文中意味着什么并不清楚。为了能在条件语句中使用,可空布尔值可以显式强制转换为 bool,但是如果对象有值 null,将引发 InvalidOperationException。因此,在强制转换为 bool 前检查 HasValue 属性很重要。
可空布尔值类似于 SQL 中使用的布尔变量类型。为了确保 & 和 | 运算符产生的结果与 SQL 的三值布尔类型一致,提供了以下预定义的运算符:
bool? operator &(bool? x, bool? y)
bool? operator |(bool? x, bool? y)
下表中列出了这些运算符的结果:
|
X
|
y
|
x&y
|
x|y
|
| True | True | True | True |
| True | False | False | True |
| True | Null | Null | True |
| False | True | False | True |
| False | False | False | False |
| False | Null | False | Null |
| Null | True | Null | True |
| Null | False | False | Null |
| Null | Null | Null | Null |