Search code examples
c#nullableroslync#-6.0null-conditional-operator

Trying to understand ?. (null-conditional) operator in C#


I have this very simple example:

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");
        }
    }
}

The line if (list?.Count > 0) compiles perfectly which means that if list is null, the expression Count > 0 becomes false by default.

However, the line if (a?.B) throws a compiler error saying I can't implicitly convert bool? to bool.

Why is one different from the other?


Solution

  • In your first case (list?.Count) the operator returns an int? - a nullable int.
    The > operator is defined for nullable integers so that if the int? has no value (is null), the comparison will return false.

    In your second example (a?.B) a bool? is returned (because if a is null, neither true nor false but null is returned). And bool? cannot be used in an if statement as the if statement requires a (non-nullable) bool.

    You can change that statement to:

    if (a?.B ?? false)
    

    to make it work again. So the null-coalescing operator (??) returns false when the null-conditional operator (?.) returned null.

    Or (as TheLethalCoder suggested):

    if (a?.B == true)