c# - operator - ¿Cómo funciona el operador de comparación con null int?
nullable class c# (3)
Como dice MSDN
Cuando realiza comparaciones con tipos anulables, si el valor de uno de los tipos anulables es nulo y el otro no, todas las comparaciones se evalúan como falsas, excepto para! = (No igual). Es importante no asumir que debido a que una comparación particular devuelve falso, el caso opuesto devuelve verdadero. En el siguiente ejemplo, 10 no es mayor que, menor que, ni igual a nulo. Solo num1! = Num2 se evalúa como verdadero.
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
*/
Estoy empezando a aprender tipos que aceptan nulos y me encontré con el siguiente comportamiento.
Al intentar nullable int, veo que el operador de comparación me da un resultado inesperado. Por ejemplo, en mi código a continuación, la salida que recibo es "ambos y 1 son iguales" . Tenga en cuenta que no imprime "nulo" también.
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);
Esperaba que cualquier entero no negativo fuera mayor que nulo. ¿Me falta algo aquí?
En resumen: cualquier comparación de desigualdad con null ( >=
, <
, <=
, >
) devuelve false
incluso si ambos operandos son nulos. es decir
null > anyValue //false
null <= null //false
Cualquier comparación de igualdad o no igualdad con null ( ==
!=
) Funciona ''como se esperaba''. es decir
null == null //true
null != null //false
null == nonNull //false
null != nonNull //true
Según MSDN , está abajo en la sección "Operadores":
Cuando realiza comparaciones con tipos anulables, si el valor de uno de los tipos que aceptan
null
esnull
y el otro no, todas las comparaciones se evalúan comofalse
excepto para!=
Entonces, tanto a > b
como a < b
evalúan a false
ya que a
es nulo ...