试着去了解? (空条件)运算符在C#
我有这个非常简单的例子:
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
,则默认情况下expression式Count > 0
变为false
。
但是,行if (a?.B)
抛出一个编译器错误,说我不能隐式转换bool?
bool
。
为什么一个与另一个不同?
-
list?.Count > 0
:在这里你比较一个int?
一个int
,产生一个bool
,因为解除了比较操作符返回一个bool
,而不是一个bool?
。 -
a?.B
:在这里,你有一个bool?
。if
,但是,需要一个bool
。
在你的第一种情况( list?.Count
)运算符返回一个int?
– 一个可空的int
。
>
运算符定义为可为空的整数,如果int?
没有值(为空),比较将返回false
。
在你的第二个例子( a?.B
)中是一个bool?
返回(因为如果a
为null,既不是true
也不false
但返回null
)。 而bool?
不能在if
语句中使用,因为if
语句需要一个(不可为空)的bool
。
您可以将该语句更改为:
if (a?.B ?? false)
使其重新工作。 所以当空条件运算符( ?.
)返回null
时,空合并运算符( ??
)返回false
。
或(如TheLethalCoderbuild议):
if (a?.B == true)