Je commence à apprendre les types nullables et je me suis heurté au comportement suivant.
Tout en essayant nullable int, je vois que l’opérateur de comparaison me donne un résultat inattendu. Par exemple, dans mon code ci-dessous, le résultat obtenu est "et 1 sont égaux". Notez que cela n’imprime pas non plus "null".
int? a = null;
int? b = 1;
if (a < b)
Console.WriteLine("{0} is bigger than {1}", b, a);
else if (a > b)
Console.WriteLine("{0} is bigger than {1}", a, b);
else
Console.WriteLine("both {0} and {1} are equal", a, b);
J'espérais que tout entier non négatif serait supérieur à null, est-ce que je manque quelque chose ici?
Selon MSDN - c'est en bas de la page dans la section "Opérateurs":
Lorsque vous effectuez des comparaisons avec des types nullables, si la valeur de l'un des types nullables est
null
et l'autre non, toutes les comparaisons sont évaluées àfalse
à l'exception de!=
Donc les deux a > b
et a < b
évaluer à false
puisque a
est nul ...
Comme dit MSDN
Lorsque vous effectuez des comparaisons avec des types nullables, si la valeur de l'un des types nullables est null et que l'autre ne l'est pas, toutes les comparaisons sont considérées comme fausses, à l'exception de! = (Différent de). Il est important de ne pas supposer que lorsqu'une comparaison donnée renvoie false, le cas contraire renvoie true. Dans l'exemple suivant, 10 n'est pas supérieur à, inférieur à, ni égal à null. Seul num1! = Num2 est évalué à true.
int? num1 = 10;
int? num2 = null;
if (num1 >= num2)
{
Console.WriteLine("num1 is greater than or equal to num2");
}
else
{
// This clause is selected, but num1 is not less than num2.
Console.WriteLine("num1 >= num2 returned false (but num1 < num2 also is false)");
}
if (num1 < num2)
{
Console.WriteLine("num1 is less than num2");
}
else
{
// The else clause is selected again, but num1 is not greater than
// or equal to num2.
Console.WriteLine("num1 < num2 returned false (but num1 >= num2 also is false)");
}
if (num1 != num2)
{
// This comparison is true, num1 and num2 are not equal.
Console.WriteLine("Finally, num1 != num2 returns true!");
}
// Change the value of num1, so that both num1 and num2 are null.
num1 = null;
if (num1 == num2)
{
// The equality comparison returns true when both operands are null.
Console.WriteLine("num1 == num2 returns true when the value of each is null");
}
/* Output:
* num1 >= num2 returned false (but num1 < num2 also is false)
* num1 < num2 returned false (but num1 >= num2 also is false)
* Finally, num1 != num2 returns true!
* num1 == num2 returns true when the value of each is null
*/
En résumé: toute comparaison d’inégalité avec null (>=
, <
, <=
, >
) renvoie false
même si les deux opérandes sont nuls. c'est à dire.
null > anyValue //false
null <= null //false
Toute comparaison d'égalité ou de non-égalité avec null (==
, !=
) fonctionne 'comme prévu'. c'est à dire.
null == null //true
null != null //false
null == nonNull //false
null != nonNull //true