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?
list?.Count > 0
: Ici, vous comparez un int?
à un int
, donnant un bool
, puisque les opérateurs de comparaison levés renvoient un bool
, pas un bool?
.a?.B
: Ici, vous avez un bool?
. if
, cependant, nécessite un bool
.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)