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 list
null
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?
list?.Count > 0
: Hier vergleichen Sie ein int?
an ein int
, was ein bool
ergibt, da aufgehobene Vergleichsoperatoren ein bool
zurückgeben, kein bool?
.a?.B
: Hier hast du ein bool?
. if
erfordert jedoch ein bool
.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)