试着去了解? (空条件)运算符在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)