¿Cómo funciona el operador de comparación con null int?


Estoy empezando a aprender tipos nullables 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 obtengo es "ambos y 1 son iguales". Nota, no imprime "null" 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 sería mayor que null, ¿me falta algo aquí?

 90
Author: Uwe Keim, 2013-04-03

3 answers

De acuerdo con MSDN - está abajo en la página en la sección" Operadores":

Cuando se realizan comparaciones con tipos nullables, si el valor de uno de los tipos nullables es null y el otro no, todas las comparaciones evalúan a false excepto !=

Así que ambos a > b y a < b evalúan a false ya que a es nulo...

 122
Author: nkvu,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-07-03 07:40:48

Como dice MSDN

Cuando se realizan comparaciones con tipos nullables, si el valor de uno de los tipos nullable es null y el otro no, todas las comparaciones evaluar a falso excepto por != (no igual). Es importante no asumir que debido a que una comparación en particular devuelve false, la el caso opuesto devuelve true. En el siguiente ejemplo, 10 no es mayor que, menor que, ni igual a null. Sólo 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
 */
 27
Author: PaRiMaL RaJ,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-04-03 02:20:46

Para resumir: cualquier comparación de desigualdad con null (>=, <, <=, >) devuelve false incluso si ambos operandos son null. 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
 16
Author: GDS,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-03-16 21:32:41