Come funziona l'operatore di confronto con null int?


151

Sto iniziando a imparare i tipi nullable e mi sono imbattuto nel seguente comportamento.

Mentre provo nullable int, vedo che l'operatore di confronto mi dà risultati inaspettati. Ad esempio, nel mio codice di seguito, l'output che ottengo è "entrambi e 1 sono uguali" . Nota, non stampa anche "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);

Speravo che qualsiasi numero intero non negativo fosse maggiore di null, mi sto perdendo qualcosa qui?


5
Ecco un piccolo violino .NET per vedere diversi casi.
Uwe Keim,

Risposte:


207

Secondo MSDN - si trova nella pagina "Operatori":

Quando si eseguono confronti con tipi nullable, se il valore di uno dei tipi nullable è nulle l'altro no, tutti i confronti vengono valutati ad falseeccezione di!=

Quindi entrambi a > be a < bvalutare da falsepoiché aè nullo ...


2
Nei miei progetti sto attualmente usando VB.NET e sembra che nothing <> 1= nullin VB mentre null != 1= truein C # - Ho usato LinqPad per testare le dichiarazioni
Luke T O'Brien,

2
Mi chiedevo solo, e vale la pena notare Lifted Operatorsin C # stackoverflow.com/questions/3370110/what-are-lifted-operators - Mi chiedevo se questo potrebbe essere il motivo per cui VB.NET restituisce risultati diversi
Luke T O'Brien

44

Come dice MSDN

Quando si eseguono confronti con tipi nullable, se il valore di uno dei tipi nullable è null e l'altro non lo è, tutti i confronti vengono considerati falsi tranne! = (Non uguale). È importante non dare per scontato che, poiché un particolare confronto restituisce false, il caso opposto restituisce true. Nel seguente esempio, 10 non è maggiore di, minore di, né uguale a null. Solo num1! = Num2 restituisce 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
 */

25

Per riassumere: ogni confronto diseguaglianza con null ( >=, <, <=, >) restituisce falseanche se entrambi gli operandi sono nulli. vale a dire

null >  anyValue //false
null <= null     //false

Qualsiasi confronto di uguaglianza o non-uguaglianza con null ( ==, !=) funziona "come previsto". vale a dire

null == null     //true
null != null     //false
null == nonNull  //false
null != nonNull  //true

È lo stesso per entrambi int? nonNulle int notNull?
Кое Кто,

1
@ КоеКто, Lo stesso comportamento è per Nullable<NumberTypes> = null. Verificato.
Artru,

2

Confronto tra C # e SQL

C #: a = null eb = null => a == b => vero

SQL: a = null eb = null => a == b => false

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.