无法隐式转换类型bool?

25

我正在尝试转换可空布尔值,但出现了这个错误。

Cannot implicitly convert type 'bool?' to 'bool'. An explicit conversion exists (are you missing a cast?)

例如:

public virtual bool? MyBool
  {
    get;
    set;
  }

if (!MyBool){}

2
简而言之,可空布尔值很令人困惑。(只需看看 SQL) - SLaks
我认为这并不太难理解,这只是三值逻辑:http://en.wikipedia.org/wiki/Three-valued_logic - 我实际上很喜欢它,因为我喜欢某些东西没有值的概念。换句话说,未初始化与已初始化。 - dyslexicanaboko
3个回答

30

正如错误所述,在条件语句中你不能使用 bool? 类型。(如果它的值是 null 会发生什么?)

相反,你可以写成 if (MyBool != true) 或者 if (MyBool == false),具体取决于你是否想要包含 null。(你需要添加一条注释来解释这一点)


6
另一个有效的检查方式是MyBool ?? false,尽管我通常更喜欢使用MyBool.GetValueOrDefault() - Anthony Pegram
@AnthonyPegram:然而,这需要额外的括号来表示否定,并且也更加令人困惑。 - SLaks
我不反对第一个观点,但我并不认为第二个更难使用或理解。通常,我不喜欢将其与真或假进行直接比较,尽管在Linq-to-EF查询中我确实这样做,因为该方法不受支持。 - Anthony Pegram

9

你需要使用MyBool.Value

例如:

if (!MyBool.Value) { }

不过,你需要测试它是否确实有一个初始值。这个测试可以证明MyBool有一个值,并且该值为false。

if (MyBool.HasValue && !MyBool.Value) { }

或者你可能真的想要以下的代码,如果代码块既没有被分配也为假,则运行它。
if (!MyBool.HasValue || !MyBool.Value) { }

这个问题实际上归结为你是否真的想要一个可空的布尔变量,如果是,你想如何处理 null, true 或 false 这三种可能的情况。


2

您需要检查它是否有值。如果MyBool == null,您想要做什么?

if( MyBool.HasValue && !MyBool.Value ) // MyBool is false
if( MyBool.HasValue && MyBool.Value ) // MyBool is true
if( !MyBool.HasValue ) // MyBool is null

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