我有一个非常简单的例子:
class Program
{
class A
{
public bool B;
}
static void Main()
{
System.Collections.ArrayList list = null;
if (list?.Count > 0)
{
System.Console.WriteLine("Contains elements");
}
A a = null;
if (a?.B)
{
System.Console.WriteLine("Is initialized");
}
}
}
if (list?.Count > 0)
行完美编译,这意味着如果list
为null
,则Count > 0
表达式默认为false
。
但是,行if (a?.B)
会抛出编译错误,说我无法将bool?
隐式转换为bool
。
为什么一个人与另一个人不同?
答案 0 :(得分:74)
list?.Count > 0
:在此您将int?
与int
进行比较,产生bool
,因为lifted comparison operators return a bool
, not a bool?
。a?.B
:此处您有一个bool?
。但是,if
需要bool
。答案 1 :(得分:38)
在您的第一个案例(list?.Count
)中,运营商会返回int?
- 可以为空的int
。
>
运算符是为可空整数定义的,因此如果int?
没有值(为空),则比较将返回false
。
在您的第二个示例(a?.B
)中,会返回bool?
(因为如果a
为空,则true
和false
都不会null
}返回)。并且bool?
无法在if
语句中使用,if
语句需要(不可为空)bool
。
您可以将该语句更改为:
if (a?.B ?? false)
让它再次运作。因此,当空条件运算符(??
)返回false
时,null-coalescing运算符(?.
)返回null
。
或(正如TheLethalCoder建议的那样):
if (a?.B == true)