Làm thế nào để toán tử so sánh làm việc với null int?


151

Tôi đang bắt đầu tìm hiểu các loại nullable và chạy theo hành vi sau.

Trong khi thử int nullable, tôi thấy toán tử so sánh cho tôi kết quả bất ngờ. Ví dụ: Trong mã của tôi dưới đây, đầu ra tôi nhận được là "cả hai và 1 đều bằng nhau" . Lưu ý, nó cũng không in "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);

Tôi đã hy vọng bất kỳ số nguyên không âm nào sẽ lớn hơn null, tôi có thiếu điều gì ở đây không?


5
Đây là một Fiddle .NET nhỏ để xem một số trường hợp.
Uwe Keim

Câu trả lời:


207

Theo MSDN - nó xuống trang trong phần "Toán tử":

Khi bạn thực hiện so sánh với các loại nullable, nếu giá trị của một trong các loại nullable nullvà loại kia thì không, tất cả các so sánh đều đánh giá falsengoại trừ!=

Vì vậy, cả hai a > ba < bđánh giá là falsetừ a...


2
Trong các dự án của tôi, tôi hiện đang sử dụng VB.NET và có vẻ như nothing <> 1= nulltrong VB trong khi null != 1= truetrong C # - Tôi đã sử dụng LinqPad để kiểm tra các báo cáo
Luke T O'Brien

2
Tôi chỉ tự hỏi, và nó đáng chú ý Lifted Operatorstrong C # stackoverflow.com/questions/3370110/what-are-lifted-operators - Tôi tự hỏi liệu đây có phải là lý do VB.NET trả về kết quả khác nhau
Luke T O'Brien

44

Như MSDN nói

Khi bạn thực hiện so sánh với các loại nullable, nếu giá trị của một trong các loại nullable là null và loại kia thì không, tất cả các so sánh đều đánh giá là false ngoại trừ! = (Không bằng). Điều quan trọng là không cho rằng bởi vì một so sánh cụ thể trả về sai, trường hợp ngược lại trả về đúng. Trong ví dụ sau, 10 không lớn hơn, nhỏ hơn, cũng không bằng null. Chỉ num1! = Num2 ước tính là đúng.

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

Để tóm tắt: bất cứ so sánh bất bình đẳng với null ( >=, <, <=, >) trả falsethậm chí nếu cả hai toán hạng là null. I E

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

Bất kỳ so sánh bình đẳng hoặc không bình đẳng với null ( ==, !=) đều hoạt động 'như mong đợi'. I E

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

Có giống nhau cho cả hai int? nonNullint notNull?
Toàn bộ

1
@ Toàn bộ, hành vi tương tự là dành cho Nullable<NumberTypes> = null. Đã xác minh.
Artru

2

So sánh C # với SQL

C #: a = null và b = null => a == b => đúng

SQL: a = null và b = null => a == b => sai

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.