我有一个非常简单的例子:
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
。
为什么其中一个与另一个不同?
发布于 2016-06-29 23:31:42
在第一种情况下(list?.Count
),操作符返回一个int?
-一个可以为空的int
。
>
运算符是为可为空的整数定义的,因此如果int?
没有值(is null),则比较将返回false
。
在第二个示例(a?.B
)中返回bool?
(因为如果a
为null,则既不返回true
,也不返回false
,但返回null
)。并且不能在if
语句中使用bool?
,因为if
语句需要(不可为空的) bool
。
您可以将该语句更改为:
if (a?.B ?? false)
才能让它再次工作。因此,当null条件运算符(??
)返回false
时,null合并运算符(?.
)返回null
。
或者(按照TheLethalCoder的建议):
if (a?.B == true)
https://stackoverflow.com/questions/38103963
复制相似问题