我如何在包含两个可空布尔值的语句中应用与操作?
好的,你想要什么结果?不允许这样做的原因是如果第一个操作数为null,则会发生不良事件。
对于可空布尔值x和y,
x && y
是什么意思?那么,首先,可空布尔值的意思是什么呢?可空布尔值有三种可能:
- 条件肯定为真
- 条件肯定为假
- 条件为true或false,但我们不知道是哪一个
那么,
x && y
是什么意思呢?它的意思是“只有当条件x为真时才评估y”,但如果x是可空的,则
我们可能不知道由x所代表的条件是否为真。
例如,假设我们有:
gotMoneyInZurich = SalesForNovemberWereMoreThanAMillionBucks() &&
TryToDepositAMillionBucksInASwissBankAccount()
如果 SalesForNovemberWereMoreThanAMillionBucks 为假,则不尝试存钱,我们知道银行里没有钱。如果为真,则尝试存钱;如果失败,则我们在苏黎世没有钱;如果成功则有钱。
现在假设并非所有销售人员都报告了他们11月份的销售数据。那么我们是否知道11月的销售额是否超过了一百万美元呢?不是的。11月已经过去了;11月份的销售额无论是超过一百万美元还是低于它,现在我们都不知道。正确的答案既不是“假”,也不是“真”:正确的答案是“我们不知道”:null。
那么如果第一个操作数返回 null,应该怎么办呢?我们不知道销售额是否超过了一百万美元,所以采取行动是正确的吗?还是不采取行动呢?根据缺失信息采取行动,还是不采取行动?
编译器没有能力为您决定这个问题。如果您想在结果未知时不存钱,则必须说:
(SalesForNovemberWereMoreThanAMillionBucks() ?? false)
意味着“如果结果为 null,则将其视为 false ”。
同样,如果您说:
if(x && y)
Frob();
如果x为真,y为空,那么你应该怎么做?你说:“只有当x和y都为真时才进行Frob。x为真,我们不知道y是否为真。”那么你应该进行Frob吗?你不知道。编译器也不知道。 如果你想表达的是“只要x为真且y为真或为空时才进行Frob”,那么就这样说:
if(x && (y ?? true))
Frob();
或者,如果 x 为真且 y 为真,但 y 为 null 则不 frob,则说:
if(x && (y ?? false))
Frob();
如果你不是出于短路求值的目的,就不要使用
&&
运算符。这时候可以使用
&
运算符,它总是会评估两边表达式,因此不会存在歧义。如果
x
和
y
是可空布尔类型,那么使用
x & y
是完全合法的。当然你仍然不能在
if
语句中使用这个东西,因为它需要一个布尔类型而不是可空布尔类型。但你可以这样写:
bool? result = x & y;
其中
x
和
y
是可空布尔类型。
true && null
,您需要什么行为? - Ani