Попытка понять?. (нуль-условный) оператор в С#

У меня есть этот очень простой пример:

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.

Почему один отличается от другого?

Ответ 2

В вашем первом случае (list?.Count) оператор возвращает int? - значение с нулевым значением int.
Оператор > определяется для целых чисел с нулевым значением, так что если int? не имеет значения (равно null), сравнение вернет false.

В вашем втором примере (a?.B) возвращается bool? (потому что если a имеет значение null, то возвращается true и false, но null). И bool? не может использоваться в выражении if, поскольку инструкция if требует (не-nullable) bool.

Вы можете изменить этот оператор на:

if (a?.B ?? false)

чтобы он снова работал. Таким образом, оператор null-coalescing (??) возвращает false, когда оператор с нулевым условием (?.) возвратил null.

Или (как предложил TheLethalCoder):

if (a?.B == true)