AND操作不能在可空的bool之间应用

我在两个可以为空的布尔值( bool? )之间应用AND操作( && ),但它给了我错误

运算符&&不能应用于bool?类型的操作数bool?bool?

我如何在包含两个可空的bool的声明中应用和操作?

如果我有像这样的对话结果

 dialog.ShowDialog () == DialogResult.OK 

我怎样才能将它转换为可以为空的bool,因为我需要在其他操作数返回可以为空的bool的if条件中放入’&&’运算符? 这是代码:

 if (dialog.ShowDialog () == DialogResult.OK && CheckProjectPath(dialog.FileName, true)) 

这个if条件中的第二个操作数是可以为空的bool。

我如何在包含两个可空的bool的声明中应用和操作?

那么,你想要发生什么? 这是非法的原因是因为如果第一个操作数为null,则会发生错误。

x && y对可空的布尔数x和y意味着什么? 那么,可空的布尔值首先意味着什么呢? 可以为空的布尔值表示以下三种情况之一:

  • 条件肯定是真的
  • 这种情况绝对是错误的
  • 条件是真还是假,但我们不知道哪一个

那么x && y是什么意思呢? 这意味着“只有当条件x为真时才评估y”,但如果x可以为空,那么我们可能不知道x表示的条件是否为真

例如,假设我们有:

 gotMoneyInZurich = SalesForNovemberWereMoreThanAMillionBucks() && TryToDepositAMillionBucksInASwissBankAccount(); 

如果SalesForNovemberWereMoreThanAMillionBucks是假的,那么不要试图存钱,我们知道银行里没有钱。 如果是真的,那就试着存钱; 如果失败了,那么我们在苏黎世没有钱; 如果成功,我们会这样做。

现在假设并非所有销售人员都报告了11月的销售数据 。 我们知道11月的销售额是否超过一百万美元? 11月是过去的; 无论是销售额还是不超过一百万美元,但现在我们还不知道 。 正确答案不是“假”,正确答案不是“真实”:正确答案是“我们不知道”:null。

那么,如果第一个操作数返回null,该怎么办呢? 我们不知道销售额是否超过一百万美元,那么试图存入资金或者不试图存入资金是正确的做法吗? 您是否应该根据缺失的信息采取行动?

编译器无法为您决定此问题。 如果你想在结果未知的情况下不存钱,那么你必须说:( (SalesForNovemberWereMoreThanAMillionBucks() ?? false)表示“如果结果为null,则将其视为假”。

同样,如果你说:

 if(x && y) Frob(); 

并且x是真的,并且y是null,那么你应该怎么做? 你只是说“Frob只有当x和y都是真的时.x是真的,我们不知道y是否为真”。 所以你不应该Frob吗? 你不知道编译器也不知道。 如果你想说的是“Frob,如果x为真且y为真或无效”,那么说:

 if(x && (y ?? true)) Frob(); 

或者,“如果x为真且y为真,则为frob,但如果y为null则不然”,然后说:

 if(x && (y ?? false)) Frob(); 

现在,如果您没有使用&&运算符进行短路评估,那么首先不要使用&&运算符 。 使用&运算符; 它总是评估双方,所以这里没有歧义。 如果x和y是可空的bool,那么说“x&y”是完全合法的。 如果x或y为null,则结果为null;如果x和y均为true,则结果为true,否则为false。 当然,你仍然不能在“if”中使用那个东西; 这需要一个布尔,而不是一个可以自欺欺人的布尔。 但你可以说:

 bool? result = x & y; 

其中x和y是可空的bools。

你可以使用类似的东西

 bool? b1 = ...; bool? b2 = ...; bool b = (b1 ?? true) && (b2 ?? false); 

你必须选择自己的默认值。

我怎样才能将它转换为可以为空的bool,因为我需要在其他操作数返回可以为空的bool的if条件中放入’&&’运算符?

你应该走另一条路:你不能对可操作的操作数进行操作,所以你必须尝试从bool?转换bool? bool 。 运营商 ?? 在这里非常有用:

  if (dialog.ShowDialog () == DialogResult.OK && CheckProjectPath(dialog.FileName, true) ?? false) 

关于“零合并算子” ?? :

 int? a, b, c; ... int d = a ?? b ?? c ?? -1; 

如果a,b和c都为null则d变为-1 。 如果其中任何一个不为null,则使用第一个值。

我只是猜你可以试试

 if ((dialog.ShowDialog() == DialogResult.OK )&& (CheckProjectPath(dialog.FileName, true) == true ) ) 
 if (dialog.ShowDialog () == DialogResult.OK && CheckProjectPath(dialog.FileName, true).GetValueOrDefault()) 

没有为null s定义&&操作。 因此,您必须确保两个布尔值都不可为空,最简单的方法是调用可以为空的布尔值的GetValueOrDefault()方法。

 if (dialog.ShowDialog () == DialogResult.OK) { var checkProjectPath = CheckProjectPath(dialog.FileName, true); if (checkProjectPath.HasValue && checkProjectPath)) {/*Your Action*/} } 

如果CheckProjectPath函数的目的是validation路径,我看不出为什么结果应该是bool?任何原因bool?