web-dev-qa-db-de.com

Versuchen zu verstehen? (nullbedingter) Operator in C #

Ich habe dieses sehr einfache Beispiel:

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

Die Zeile if (list?.Count > 0) wird perfekt kompiliert, dh wenn listnull ist, wird der Ausdruck Count > 0 Standardmäßig false.

Die Zeile if (a?.B) gibt jedoch einen Compilerfehler aus, der besagt, dass ich bool? Nicht implizit in bool konvertieren kann.

Warum unterscheidet sich einer vom anderen?

62
Dee J. Doena
75
Heinzi

In Ihrem ersten Fall (list?.Count) Der Operator gibt ein int? - eine nullable int.
Das > -Operator ist für nullbare Ganzzahlen definiert, sodass, wenn der int? hat keinen Wert (ist null), der Vergleich gibt false zurück.

In Ihrem zweiten Beispiel (a?.B) ein bool? wird zurückgegeben (denn wenn a null ist, werden weder true noch false, sondern null zurückgegeben). Und bool? kann nicht in einer if -Anweisung verwendet werden, da für die if -Anweisung eine (nicht nullfähige) bool erforderlich ist.

Sie können diese Anweisung ändern in:

if (a?.B ?? false)

damit es wieder funktioniert. Also der Null-Koaleszenz-Operator (??) gibt false zurück, wenn der nullbedingte Operator (?.) gab null zurück.

Oder (wie TheLethalCoder vorschlug):

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