Bagaimana cara kerja operator perbandingan dengan null int?


151

Saya mulai mempelajari jenis yang dapat dibatalkan dan menjalankan perilaku berikut.

Saat mencoba nullable int, saya melihat operator perbandingan memberi saya hasil yang tidak terduga. Misalnya, Dalam kode saya di bawah ini, Output yang saya dapatkan adalah "keduanya dan 1 sama" . Catatan, itu tidak mencetak "null" juga.

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);

Saya berharap bilangan bulat non-negatif akan lebih besar dari nol, Apakah saya kehilangan sesuatu di sini?


5
Berikut ini adalah .NET Fiddle kecil untuk melihat beberapa kasus.
Uwe Keim

Jawaban:


207

Menurut MSDN - itu di halaman di bagian "Operator":

Saat Anda melakukan perbandingan dengan jenis yang dapat dibatalkan, jika nilai salah satu dari jenis yang dapat dibatalkan adalah nulldan yang lainnya tidak, semua perbandingan akan dievaluasi falsekecuali untuk!=

Jadi keduanya a > bdan a < bmengevaluasi falsekarena aitu nol ...


2
Dalam proyek saya, saya saat ini menggunakan VB.NET dan tampaknya nothing <> 1= nulldi VB sedangkan null != 1= truedi C # - Saya telah menggunakan LinqPad untuk menguji pernyataan
Luke T O'Brien

2
Saya hanya ingin tahu, dan perlu dicatat tentang Lifted Operatorsdi C # stackoverflow.com/questions/3370110/what-are-lifted-operators - Saya bertanya-tanya apakah ini mungkin alasan VB.NET mengembalikan hasil yang berbeda
Luke T O'Brien

44

Seperti kata MSDN

Saat Anda melakukan perbandingan dengan jenis yang dapat dibatalkan, jika nilai salah satu dari jenis yang dapat dibatalkan adalah nol dan yang lainnya tidak, semua perbandingan akan dinilai salah kecuali untuk! = (Tidak sama). Penting untuk tidak mengasumsikan bahwa karena perbandingan tertentu mengembalikan false, kasus sebaliknya menghasilkan true. Dalam contoh berikut, 10 tidak lebih besar dari, kurang dari, atau sama dengan nol. Hanya num1! = Num2 yang bernilai 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

Untuk meringkas: setiap perbandingan ketidaksetaraan dengan nol ( >=, <, <=, >) mengembalikan falsebahkan jika kedua operan null. yaitu

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

Setiap perbandingan kesetaraan atau non-kesetaraan dengan null ( ==, !=) berfungsi 'seperti yang diharapkan'. yaitu

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

Apakah sama untuk keduanya int? nonNulldan int notNull?
Кое Кто

1
@ КоеКто, Perilaku yang sama untuk Nullable<NumberTypes> = null. Diverifikasi.
Artru

2

Membandingkan C # dengan SQL

C #: a = null dan b = null => a == b => true

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

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.