66 votes

J'essaie de comprendre Opérateur (conditionnel nul) en C#

J'ai un 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) compile parfaitement, ce qui signifie que si list es null l'expression Count > 0 devient false par défaut.

Cependant, la ligne if (a?.B) jette une erreur de compilation en disant que je ne peux pas convertir implicitement bool? a bool .

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

80voto

Heinzi Points 66519

41voto

René Vogt Points 2704

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

Dans votre deuxième exemple ( a?.B ) a bool? est renvoyé (car si a est nulle, ni true ni false pero null est renvoyée). Et bool? ne peut pas être utilisé dans un if comme le if requiert une déclaration (non nulle) bool .

Vous pouvez changer cette déclaration en :

if (a?.B ?? false)

pour le faire fonctionner à nouveau. Ainsi, l'opérateur de coalescence nulle ( ?? ) retourne false lorsque l'opérateur conditionnel nul ( ?. ) est retourné null .

Ou (comme le suggère TheLethalCoder) :

if (a?.B == true)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X