如何从众多可空布尔值中返回一个布尔值?

14

使用此代码:

private bool AtLeastOnePlatypusChecked()
{
    return ((ckbx1.IsChecked) ||
            (ckbx2.IsChecked) ||
            (ckbx3.IsChecked) ||
            (ckbx4.IsChecked));
}

...我被惊呆了。

Operator '||' cannot be applied to operands of type 'bool?' and 'bool?

那么我该如何完成这个任务呢?


1
http://www.merriam-webster.com/dictionary/plethora - Olivier Jacot-Descombes
6个回答

31
你可以在末尾使用空值合并运算符,将|链接在一起:
return (ckbx1.IsChecked | cxbx2.IsChecked | cxbx3.IsChecked | cxbx4.IsChecked) ?? false;

提升的 | 运算符会在其操作数有一个为true 时返回true,如果两个操作数都为false 则返回 false,如果其中一个操作数为null 而另一个不为true则返回null

它不是短路计算,但我不认为这在这种情况下会成为问题。

或者 - 更具扩展性 - 将复选框放入某种集合中。然后你可以使用:

return checkboxes.Any(cb => cb.IsChecked ?? false);

我也对那个术语很好奇,不过看起来Jon已经回答了那个问题 - Mike Christensen
我认为 | 运算符不使用短路求值,因此可能会对性能产生轻微影响,但对于这个示例来说应该是可以忽略不计的。 - Joe
@EricLippert:感谢提供链接。在数学上下文中,“null”一词是什么意思? - Olivier Jacot-Descombes
@JeppeStigNielsen:我是在回应Olivier关于不知道“lifted”是什么意思的评论;由于C#语言在使用这个术语时存在不一致性,我认为指出这一点是值得的。当然,Jon的答案是正确的。 - Eric Lippert
1
@JeppeStigNielsen:在我离开之前,我已经修复了Roslyn中的那个bug。我不再是“那些人”之一了。 :-) - Eric Lippert
显示剩余5条评论

11

尝试:

return ((ckbx1.IsChecked ?? false) ||
        (ckbx2.IsChecked ?? false) ||
        ...

6
我假设如果是 null,则它将为 false,你可以使用 ?? 运算符。
 private bool AtLeastOnePlatypusChecked()
 {
      return ((ckbx1.IsChecked ?? false) ||
      (ckbx2.IsChecked ?? false) ||
      (ckbx3.IsChecked ?? false) ||
      (ckbx4.IsChecked ?? false));
 }

5
您可以使用GetValueOrDefault()方法来获取值,或者false
private bool AtLeastOnePlatypusChecked()
{
    return ((ckbx1.IsChecked.GetValueOrDefault()) ||
            (ckbx2.IsChecked.GetValueOrDefault()) ||
            (ckbx3.IsChecked.GetValueOrDefault()) ||
            (ckbx4.IsChecked.GetValueOrDefault()));
}

4
您可以使用以下内容:
(ckbx1.IsChecked.HasValue && ckbx1.IsChecked.Value)

2
应该使用 && 运算符代替 || 吗?如果 cbx1.IsChecked.HasValuefalse,那么在获取 ckbx1.IsChecked.Value 时会出现 Null Reference - Shane Charles

2

在你的方法内使用 ?? 运算符;

private bool AtLeastOnePlatypusChecked()
{
return ((ckbx1.IsChecked ?? false) ||
        (ckbx2.IsChecked ?? false) ||
        (ckbx3.IsChecked ?? false) ||
        (ckbx4.IsChecked ?? false)
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接