试图理解? C# 中的(空条件)运算符

Trying to understand ?. (null-conditional) operator in 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,则表达式 Count > 0 默认变为 false

但是,行 if (a?.B) 抛出一个编译器错误,提示我无法将 bool? 隐式转换为 bool

为什么一个与另一个不同?

  • list?.Count > 0:在这里你将 int?int 进行比较,得到 bool,因为 lifted comparison operators return a bool, not a bool?.
  • a?.B:在这里,你有一个bool?。然而,if 需要 bool.

在您的第一种情况 (list?.Count) 中,运算符 return 是一个 int? - 可为空的 int.
> 运算符是为可为空的整数定义的,因此如果 int? 没有值(为空),比较将 return false.

在您的第二个示例 (a?.B) 中 bool? 被 return 编辑(因为如果 a 为空,则 truefalsenull 是 returned)。并且 bool? 不能在 if 语句中使用,因为 if 语句需要(不可为 null)bool.

您可以将该语句更改为:

if (a?.B ?? false)

让它重新工作。因此,空合并运算符 (??) returns false 当空条件运算符 (?.) returned null.

或者(如 TheLethalCoder 建议的那样):

if (a?.B == true)