转换可为空的布尔值?布尔


122

您如何将可空值转换bool?bool在C#中?

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

Answers:


200

您最终必须决定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还是将引发异常?
路加·奥布莱恩

可以编译吗?
Ken Pespisa

是的,确实如此-在“快速操作”中建议使用Linq“哪里”子句,我不明白为什么lifted operators在Linq中似乎不起作用(也许只是VB.NET?)-我刚刚进行了测试,它确实引发了无效的强制转换例外
Luke T O'Brien

喜欢它!:) 谢谢!
praguan '17

或者:bool newBool​​ = x == true;
尼克·韦斯特盖特 Nick Westgate)

104

您可以使用空合并运算符x ?? something,其中something是要使用,如果一个布尔值xnull

例:

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

newBool 将是错误的。


1
因此,bool? myBool = null; bool newBool = myBool ?? false;
CaffGeek

86

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

 bool? nullableBool = null;

 bool actualBool = nullableBool.GetValueOrDefault();

6
我认为这是简洁与C#新手友好之间的最佳结合。还请注意,有一个过载可以在其中指定默认值。
菲尔(Phil)

4
我喜欢使用此方法,因为它可以创建“典雅”的if语句if (nullableBool.GetValueOrDefault())
Luc Wollants 2014年

9

如果要bool?if语句中使用,我发现最简单的方法是将true或进行比较false

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

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

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

}

??通过检查所提供的空的表达式可空值的作品。如果可为空的表达式具有一个值,则将使用它的值,否则它将使用位于??



2

完整的方法是:

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

或者您可以使用来测试特定值

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


2

当您只想测试bool?条件时,此答案适用于用例。它也可以用来获得法线bool。我个人认为这是一种比阅读更容易的选择coalescing operator ??

如果要测试条件,可以使用此

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

只有在true时,上述if才bool?为true。

您也可以使用它boolbool?

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

女巫与

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

0

这是主题上的一个有趣的变化。乍一看,您会假设采用了真实的分支。不是这样!

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

获得所需内容的方法是执行以下操作:

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.