为什么我必须明确询问可空的布尔变量是否为真?

时间:2011-02-10 16:13:59

标签: c# c#-4.0 c#-3.0

bool? nullableVar;
if(nullableVar) 

给了我一个错误但是

if(nullableVar==true) 

评估罚款。

我不确定为什么会这样做,如果bool不可为空,会评价为好吗?

7 个答案:

答案 0 :(得分:4)

撰写if (nullableVar)会尝试将bool?隐式转换为bool。 (因为if需要bool s)

由于没有从T?T的隐式转换,因此您无法做到这一点。

请注意,您也可以写

if (nullableVar ?? false)

答案 1 :(得分:4)

if的条件表达式必须可隐式转换为boolNullable<bool> 可转换为bool,但第二个表达式 已经是bool类型,所以没关系。看看IL,我相信第二个表达式正在编译为:

if (nullableVar.GetValueOrDefault())

答案 2 :(得分:1)

Nullable<T>显式可转换为T。在您的情况下,bool?只能明确转换为bool。你在这里尝试做的是隐式转换(显式转换需要强制转换为所需类型,而隐式转换不需要)。

您的比较是一个导致bool的表达式,这就是允许的原因。

答案 3 :(得分:0)

if子句必须是布尔类型。 Null不是布尔类型。通过比较,您将创建一个结果为布尔值的表达式。

答案 4 :(得分:0)

可以为空的bool可以有3个不同的值:true,false或null

bool? myNullableBool;
if (myNullableBool == false)
...

非可空bool只能有2个值:true或false

bool myBool;
if (myBool)
...

答案 5 :(得分:0)

由于==使用Equals重载调用,而if()期望表达式为bool(或者Jon Skeet表示隐式可转换为bool )。

答案 6 :(得分:0)

bool?(例如nullableVar)可以有三个不同的值: true false null

if(nullableVar) null 时,

nullableVar不明确。

if(nullableVar==true) null 时,

nullableVar显然是 false