【问题标题】:Convert nullable bool? to bool转换可为空的布尔值?布尔
【发布时间】:2019-06-11 01:46:03
【问题描述】:

如何在 C# 中将可空的 bool? 转换为 bool

我尝试过x.Valuex.HasValue ...

【问题讨论】:

    标签: c# nullable


    【解决方案1】:

    您最终必须决定 null bool 将代表什么。如果null 应该是false,你可以这样做:

    bool newBool = x.HasValue ? x.Value : false;
    

    或者:

    bool newBool = x.HasValue && x.Value;
    

    或者:

    bool newBool = x ?? false;
    

    【讨论】:

    • VB.NET 中的情况如何:dim newBool as Boolean = CBool(x)null会被转换成false还是会抛出异常?
    • 这还能编译吗?
    • 是的 - 在“快速操作”中建议 Linq 声明“Where”子句,我不明白为什么 lifted operators 在 Linq 中似乎不起作用(也许它只是 VB.NET?) - 我刚刚测试过,它确实抛出了一个无效的强制转换异常
    • 喜欢! :) 谢谢!
    • 或者:bool newBool​​ = x == true;
    【解决方案2】:

    您可以使用null-coalescing operatorx ?? something,其中something 是一个布尔值,如果xnull,您要使用它。

    例子:

    bool? myBool = null;
    bool newBool = myBool ?? false;
    

    newBool 将是假的。

    【讨论】:

    • 所以,bool? myBool = null; bool newBool = myBool ?? false;
    【解决方案3】:

    您可以使用Nullable{T} GetValueOrDefault() 方法。如果为 null,这将返回 false。

     bool? nullableBool = null;
    
     bool actualBool = nullableBool.GetValueOrDefault();
    

    【讨论】:

    • 我认为这是简洁和 C# noob-friendly 之间的最佳混合。另请注意,您可以在其中指定默认值。
    • 我喜欢使用这种方法,因为它可以创建'优雅'的if语句if (nullableBool.GetValueOrDefault())
    【解决方案4】:

    如果您要在if 语句中使用bool?,我发现最简单的做法是与truefalse 进行比较。

    bool? b = ...;
    
    if (b == true) { Debug.WriteLine("true"; }
    if (b == false) { Debug.WriteLine("false"; }
    if (b != true) { Debug.WriteLine("false or null"; }
    if (b != false) { Debug.WriteLine("true or null"; }
    

    当然,你也可以和null比较。

    bool? b = ...;
    
    if (b == null) { Debug.WriteLine("null"; }
    if (b != null) { Debug.WriteLine("true or false"; }
    if (b.HasValue) { Debug.WriteLine("true or false"; }
    //HasValue and != null will ALWAYS return the same value, so use whatever you like.
    

    如果您要将其转换为布尔值以传递给应用程序的其他部分,那么 Null Coalesce 运算符就是您想要的。

    bool? b = ...;
    bool b2 = b ?? true; // null becomes true
    b2 = b ?? false; // null becomes false
    

    如果您已经检查了 null,并且只需要该值,请访问 Value 属性。

    bool? b = ...;
    if(b == null)
        throw new ArgumentNullException();
    else
        SomeFunc(b.Value);
    

    【讨论】:

      【解决方案5】:

      最简单的方法是使用空合并运算符:??

      bool? x = ...;
      if (x ?? true) { 
      
      }
      

      具有可空值的?? 通过检查提供的可空表达式来工作。如果可为空的表达式有一个值,则将使用它的值,否则它将使用??右侧的表达式

      【讨论】:

        【解决方案6】:

        此答案适用于您只想在条件下测试bool? 的用例。它也可以用来获取普通的bool。这是我个人认为比coalescing operator ?? 更容易阅读的另一种选择。

        如果你想测试一个条件,你可以使用这个

        bool? nullableBool = someFunction();
        if(nullableBool == true)
        {
            //Do stuff
        }
        

        仅当bool? 为真时,上述 if 才会为真。

        您也可以使用它从bool? 分配一个常规的bool

        bool? nullableBool = someFunction();
        bool regularBool = nullableBool == true;
        

        女巫是一样的

        bool? nullableBool = someFunction();
        bool regularBool = nullableBool ?? false;
        

        【讨论】:

          【解决方案7】:
          bool? a = null;
          bool b = Convert.toBoolean(a); 
          

          【讨论】:

            【解决方案8】:

            完整的方法是:

            bool b1;
            bool? b2 = ???;
            if (b2.HasValue)
               b1 = b2.Value;
            

            或者您可以使用

            测试特定值
            bool b3 = (b2 == true); // b2 is true, not false or null
            

            【讨论】:

              【解决方案9】:

              类似:

              if (bn.HasValue)
              {
                b = bn.Value
              }
              

              【讨论】:

                【解决方案10】:

                这是一个有趣的主题变体。乍一看,你会假设真正的分支被拿走了。不是这样!

                bool? flag = null;
                if (!flag ?? true)
                {
                    // false branch
                }
                else
                {
                    // true branch
                }
                

                得到你想要的东西的方法是这样做:

                if (!(flag ?? true))
                {
                    // false branch
                }
                else
                {
                    // true branch
                }
                

                【讨论】:

                  猜你喜欢
                  • 1970-01-01
                  • 2018-01-24
                  • 1970-01-01
                  • 2022-06-12
                  • 2021-06-27
                  • 1970-01-01
                  • 1970-01-01
                  • 2011-12-26
                  • 1970-01-01
                  相关资源
                  最近更新 更多