我在两个可以为空的布尔值(&&
)之间应用AND操作(bool?
),但它给了我错误
运营商
&&
无法应用于bool?
和bool?
类型的操作数
我如何在包含两个可空的bool的声明中应用和操作?
此外,如果我有像
这样的对话结果dialog.ShowDialog () == DialogResult.OK
如何将它转换为可空的bool,因为我需要放'&&'运算符在if条件下,其他操作数返回可空的bool? 这是代码:
if (dialog.ShowDialog () == DialogResult.OK && CheckProjectPath(dialog.FileName, true))
此if条件中的第二个操作数是可以为空的bool。
答案 0 :(得分:18)
我如何在包含两个可空的bool的声明中应用和操作?
那么,你想要发生什么?这是非法的原因是因为如果第一个操作数为空,就会发生坏事。
x && y
对可空的布尔值x和y有什么意义?那么,可空的布尔值首先意味着什么呢?可空的布尔值意味着三件事之一:
那么x && y
意味着什么?它的意思是“仅当条件x为真时才评估y”,但如果x可以为空,那么我们可能不知道x表示的条件是否为真。
例如,假设我们有:
gotMoneyInZurich = SalesForNovemberWereMoreThanAMillionBucks() &&
TryToDepositAMillionBucksInASwissBankAccount();
如果SalesForNovemberWereMoreThanAMillionBucks是假的,那么不要试图存钱,我们知道银行里没有钱。如果是真的,那就试着存钱;如果失败了,那么我们在苏黎世没有钱;如果成功,我们会这样做。
现在假设并非所有销售人员都报告了11月的销售数据。我们知道11月份的销售额是否超过一百万美元?十一号是过去的;无论是销售额还是不超过一百万美元,但现在我们不知道。正确答案不是“假”,正确答案不是“真实”:正确答案是“我们不知道”:null。
那么如果第一个操作数返回null,该怎么办呢?我们不知道销售额是否超过一百万美元,因此尝试存入资金或不试图存入资金是正确的做法吗?您是否应该根据缺失的信息采取行动?
编译器无法为您决定此问题。如果结果未知,如果您不想存钱,则必须说明:(SalesForNovemberWereMoreThanAMillionBucks() ?? false)
表示“如果结果为null,则将其视为假“。
同样,如果你说:
if(x && y)
Frob();
和x为真,y为空,那么你该怎么办?你只是说“Frob只有当x和y都是真的时.x是真的,我们不知道y是否为真”。所以你应该Frob与否? 你不知道。 编译器也不知道。如果你想说的是“Frob,如果x为真且y为真或无”,那就说:
if(x && (y ?? true))
Frob();
或者,“如果x为真且y为真,则为frob,但如果y为空则不然”,则说:
if(x && (y ?? false))
Frob();
现在,如果你没有使用&&为了进行短路评估,运营商不要使用&& amp;首先是运营商。使用&操作;它总是评估双方,所以这里没有歧义。如果x和y是可以为空的bool,那么说“x& y”是完全合法的。如果x或y为null,则结果为null;如果x和y均为true,则结果为true,否则返回false。当然,你仍然不能在“if”中使用那个东西;这需要一个布尔,而不是一个可以自欺欺人的布尔。但你可以说:
bool? result = x & y;
其中x和y是可以为空的bools。
答案 1 :(得分:7)
您可以使用类似
的内容bool? b1 = ...;
bool? b2 = ...;
bool b = (b1 ?? true) && (b2 ?? false);
您必须选择自己的默认值。
如何将它转换为可空的bool,因为我需要放'&&'运算符在if条件下,其他操作数返回可空的bool?
你应该走另一条路:你不能对可以为空的操作数进行操作,所以你必须尝试从bool?
转换为bool
。运营商 ??在这里非常有用:
if (dialog.ShowDialog () == DialogResult.OK
&& CheckProjectPath(dialog.FileName, true) ?? false)
关于"null-coalescing operator" ?? :
int? a, b, c;
...
int d = a ?? b ?? c ?? -1;
如果a,b和c都是null
,则d变为-1
。如果其中任何一个不为null,则使用第一个值。
答案 2 :(得分:1)
我猜你可以试试
if ((dialog.ShowDialog() == DialogResult.OK )&&
(CheckProjectPath(dialog.FileName, true) == true ) )
答案 3 :(得分:1)
if (dialog.ShowDialog () == DialogResult.OK &&
CheckProjectPath(dialog.FileName, true).GetValueOrDefault())
&&
未定义null
操作。因此,您必须确保两个布尔值都不可为空,并且最简单的方法是调用可以为空的布尔值的GetValueOrDefault()
方法。
答案 4 :(得分:0)
if (dialog.ShowDialog () == DialogResult.OK)
{
var checkProjectPath = CheckProjectPath(dialog.FileName, true);
if (checkProjectPath.HasValue && checkProjectPath)) {/*Your Action*/}
}
如果CheckProjectPath函数的目的是验证路径,我看不出结果应该是bool?
的任何理由