【问题标题】:How can I return a bool value from a plethora of nullable bools?如何从大量可为空的布尔值中返回布尔值?
【发布时间】:2012-12-06 04:48:32
【问题描述】:

使用此代码:

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

...我被

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

那么我该如何实现呢?

【问题讨论】:

标签: c# boolean nullable


【解决方案1】:

您可以使用以下内容:

(ckbx1.IsChecked.HasValue && ckbx1.IsChecked.Value)

【讨论】:

  • || 应该是&& 运算符吗?如果cbx1.IsChecked.HasValuefalse,那么在获取ckbx1.IsChecked.Value 时会有一个Null Reference
【解决方案2】:

试试:

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

【讨论】:

    【解决方案3】:

    您可以将|s 链接在一起,最后使用空合并运算符:

    return (ckbx1.IsChecked | cxbx2.IsChecked | cxbx3.IsChecked | cxbx4.IsChecked) ?? false;
    

    如果任一操作数为true,提升的| 运算符返回true,如果两个操作数均为false,则返回false,如果任一操作数为null 而另一个不是@,则返回null 987654333@.

    这不是短路,但我认为在这种情况下这对你来说不是问题。

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

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

    【讨论】:

    • 我终于知道“提升”是什么意思了。我在使用表达式树时遇到了这个术语。
    • 我也对这个词很好奇,但它看起来像Jon has already answered that question
    • 我相信 |操作数不使用短路评估,因此可能会对性能产生轻微影响,在本示例中可能可以忽略不计。
    • @OlivierJacot-Descombes:有关详细讨论,请参阅 blogs.msdn.com/b/ericlippert/archive/2007/06/27/…。此外,如果您对这个主题感兴趣,我将在本月晚些时候在我的新博客(ericlippert.com)中回到这个主题。
    • @JeppeStigNielsen:我在离开之前修复了 Roslyn 中的那个错误。我不再是“那些家伙”中的一员了。 :-)
    【解决方案4】:

    我假设如果为 null,那么它将为 false,您可以使用 ??运算符。

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

    【讨论】:

      【解决方案5】:

      在您的方法中使用?? 运算符;

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

      【讨论】:

        【解决方案6】:

        您可以使用GetValueOrDefault() 获取值或false

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

        【讨论】:

          猜你喜欢
          • 2018-01-24
          • 2015-04-07
          • 1970-01-01
          • 1970-01-01
          • 2013-05-21
          • 2013-08-18
          • 2014-02-07
          • 2018-08-22
          相关资源
          最近更新 更多