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

ghd*_*ghd 8 c# nullable operators

&&在两个可以为空的boolean ()之间应用AND operation(),bool?但它给了我错误

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

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

如果我有一个对话框结果,如果

dialog.ShowDialog () == DialogResult.OK
Run Code Online (Sandbox Code Playgroud)

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

if (dialog.ShowDialog () == DialogResult.OK && CheckProjectPath(dialog.FileName, true))
Run Code Online (Sandbox Code Playgroud)

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

Eri*_*ert 18

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

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

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

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

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

例如,假设我们有:

gotMoneyInZurich = SalesForNovemberWereMoreThanAMillionBucks() &&
    TryToDepositAMillionBucksInASwissBankAccount();
Run Code Online (Sandbox Code Playgroud)

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

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

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

编译器无法为您决定此问题.如果你想不存钱,如果结果不明,那么你必须说:(SalesForNovemberWereMoreThanAMillionBucks() ?? false)意思是"如果结果是空的,就把它视为假的".

同样,如果你说:

if(x && y)
    Frob();
Run Code Online (Sandbox Code Playgroud)

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

if(x && (y ?? true))
    Frob();
Run Code Online (Sandbox Code Playgroud)

或者,"如果x为真且y为真,则为frob,但如果y为空则不为",则说:

if(x && (y ?? false))
    Frob();
Run Code Online (Sandbox Code Playgroud)

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

bool? result = x & y;
Run Code Online (Sandbox Code Playgroud)

其中x和y是可以为空的bools.

  • @Adam:我在编译器中实现了这些规则;你会认为我能够正确地描述它们。:) 谢谢你的留言。 (2认同)

Hen*_*man 7

你可以使用类似的东西

bool? b1 = ...;
bool? b2 = ...;    
bool b = (b1 ?? true) && (b2 ?? false);
Run Code Online (Sandbox Code Playgroud)

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

我如何将其转换为可空的bool,因为我需要在其他操作数返回可以为空的bool的if条件中放入'&&'运算符?

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

 if (dialog.ShowDialog () == DialogResult.OK 
     && CheckProjectPath(dialog.FileName, true) ?? false)
Run Code Online (Sandbox Code Playgroud)

关于"零合并算子" ?? :

int? a, b, c;
...
int d = a ?? b ?? c ?? -1;
Run Code Online (Sandbox Code Playgroud)

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