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

时间:2010-12-03 19:11:49

标签: c# operators nullable

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

  

运营商&&无法应用于bool?bool?类型的操作数

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

此外,如果我有像

这样的对话结果
dialog.ShowDialog () == DialogResult.OK

如何将它转换为可空的bool,因为我需要放'&&'运算符在if条件下,其他操作数返回可空的bool? 这是代码:

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

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

5 个答案:

答案 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?的任何理由