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

C# 为什么我必须明确地询问一个可为空的布尔变量是否为真?,c#,c#-4.0,c#-3.0,C#,C# 4.0,C# 3.0,给我一个错误但是 bool? nullableVar; if(nullableVar) 评价很好 我不确定为什么会给出这样的结论:如果bool不可为null,那么计算结果就可以了?编写if(nullableVar)将尝试隐式地将bool?转换为bool。(因为ifs需要bools) 因为没有从T?到T的隐式转换,所以不能这样做 请注意,您还可以编写 if(nullableVar==true) if的条件表达式必须隐式转换为boolNullable不能转换为bool,但是第二个表达式的类型

给我一个错误但是

bool? nullableVar;
if(nullableVar) 
评价很好

我不确定为什么会给出这样的结论:如果bool不可为null,那么计算结果就可以了?

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

因为没有从
T?
T
的隐式转换,所以不能这样做

请注意,您还可以编写

if(nullableVar==true) 

if
的条件表达式必须隐式转换为
bool
Nullable
不能转换为
bool
,但是第二个表达式的类型已经是
bool
,所以它可以。看看IL,我相信第二个表达式真的被编译为:

if (nullableVar ?? false)

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

Nullable
只能显式转换为
T
。在您的情况下,
bool?
只能显式转换为
bool
。这里尝试的是隐式转换(显式转换需要转换为所需的类型,而隐式转换则不需要)


您的比较是一个表达式,它会导致一个
bool
,这就是为什么它是允许的。

一个可为空的bool可以有三个不同的值:true、false或null

if (nullableVar.GetValueOrDefault())
不可为null的bool只能有2个值:true或false

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

因为
==
使用
Equals
重载调用,而
if()
期望表达式是
bool
(或者正如Jon Skeet所说的隐式转换为
bool
)。

一个
bool?
(例如
nullableVar
)可以有三个不同的值:truefalsenull

if(nullableVar)
nullableVar
null时不明确


如果(nullableVar==true)
显然是false
nullableVar
null

这是一个好问题,但是,为什么Nullable没有一个隐式的t转换器呢除了“如果为null会发生什么”之外,我认为……它可以转换为
bool
,但只能显式转换。@Massif:隐式转换不应丢失数据或抛出异常。很难看出从三种可能的状态(真/假/空)到两种可能的状态(真/假)的隐式转换是如何解决这个问题的。感谢本Jon的全面报道。我没有按照三州制的思路思考。更多关于为什么它不被视为检查值是否为真的条件。@Massif:
t?
只是C#表示
Nullable
。感谢您对此的回复。没有意识到无法转换。干杯这是一个副本,有一个伟大的,详细的答案
bool myBool;
if (myBool)
...