web-dev-qa-db-fra.com

Essayer de comprendre ?. (null-conditionnel) opérateur en C #

J'ai cet exemple très simple:

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

La ligne if (list?.Count > 0) se compile parfaitement ce qui signifie que si list est null, l'expression Count > 0 Devient false par défaut.

Cependant, la ligne if (a?.B) renvoie une erreur de compilation indiquant que je ne peux pas implicitement convertir bool? En bool.

Pourquoi l'un est-il différent de l'autre?

62
Dee J. Doena
75
Heinzi

Dans votre premier cas (list?.Count) l'opérateur renvoie un int? - un int nullable.
Le > L'opérateur est défini pour les entiers nullables de sorte que si le int? n'a pas de valeur (est nul), la comparaison renverra false.

Dans votre deuxième exemple (a?.B) une bool? est retourné (car si a est nul, ni true ni false mais null est retourné). Et bool? ne peut pas être utilisé dans une instruction if car l'instruction if requiert un bool (non nul).

Vous pouvez modifier cette déclaration en:

if (a?.B ?? false)

pour le faire fonctionner à nouveau. Ainsi, l'opérateur de coalescence nulle (??) renvoie false lorsque l'opérateur de condition nulle (?.) a renvoyé null.

Ou (comme l'a suggéré TheLethalCoder):

if (a?.B == true)
38
René Vogt