web-dev-qa-db-fra.com

Comment l'opérateur de comparaison fonctionne-t-il avec null int?

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?

123
Ron5504

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 ...

178
nkvu

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
 */
36
PaRiMaL RaJ

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
23
GDS