将可空的bool?转换为bool。

172

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

我尝试了使用x.Valuex.HasValue ...

10个回答

292

最终你必须决定null的布尔值表示方式。如果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还是会抛出异常? - Luke T O'Brien
那能编译吗? - Ken Pespisa
是的,它确实会 - 在“快速操作”中建议在 Linq 语句的“Where”子句中使用,我无法理解为什么 lifted operators 似乎无法在 Linq 中工作(也许只是 VB.NET?)- 我刚刚测试了一下,它确实会抛出一个无效的转换异常。 - Luke T O'Brien
喜欢它!:) 谢谢! - Husni Salax
或者:bool newBool = x == true; - Nick Westgate

129
您可以使用null-coalescing operator: x ?? something,其中something是一个布尔值,如果xnull,则您想要使用它。

示例:

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

newBool将为false。


2
所以,bool? myBool = null; bool newBool = myBool ?? false; - CaffGeek

96
您可以使用 Nullable{T}GetValueOrDefault() 方法。如果为null,它将返回false。
 bool? nullableBool = null;

 bool actualBool = nullableBool.GetValueOrDefault();

9
我认为这是简洁性和 C# 初学者友好性之间的最佳混合。另外请注意,还有一种重载方式,您可以指定默认值。 - Phil
5
我喜欢使用这种方法,因为它可以创建“优雅”的if语句 if (nullableBool.GetValueOrDefault()) - Luc Wollants

11

如果你要在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);

7

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

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

}

带有可空值的 ?? 运算符通过检查提供的可空表达式来工作。如果可空表达式有值,则使用该值,否则将使用 ?? 右侧的表达式。


5

这篇答案是针对当您仅想在条件中测试bool?的用例。它也可以用于获取普通的bool。个人认为,这是一种比coalescing operator ??更易于阅读的替代方法。

如果您想测试一个条件,可以使用以下方法:

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

如果bool?为true,上述条件才成立。

您还可以使用它将bool?分配给常规的bool

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

这意味着与

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

3
bool? a = null;
bool b = Convert.toBoolean(a); 

2

类似这样:

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

2
完整的步骤如下:
bool b1;
bool? b2 = ???;
if (b2.HasValue)
   b1 = b2.Value;

或者您可以使用以下方法测试特定的值:

bool b3 = (b2 == true); // b2 is true, not false or null

0

这是一个有趣的主题变化。乍一看和第二眼看起来你会认为真分支被执行了。但事实并非如此!

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

获得你想要的方式是这样的:

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

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