试着去了解? (空条件)运算符在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)完全编译,这意味着如果listnull ,则默认情况下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)