ตัวดำเนินการเปรียบเทียบทำงานอย่างไรกับ null int


151

ฉันเริ่มเรียนรู้ประเภท nullable และพบกับพฤติกรรมดังต่อไปนี้

ในขณะที่พยายาม nullable int ฉันเห็นตัวดำเนินการเปรียบเทียบให้ผลลัพธ์ที่ไม่คาดคิด ยกตัวอย่างเช่นในรหัสของฉันด้านล่างผลผลิตที่ฉันได้รับคือ"ทั้ง 1 และมีค่าเท่ากัน" หมายเหตุมันไม่พิมพ์ "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);

ฉันหวังว่าเลขจำนวนเต็มใด ๆ ที่ไม่เป็นลบจะยิ่งใหญ่กว่าโมฆะฉันขาดอะไรไปหรือเปล่า


5
นี่คือซอเล็ก ๆ . NET ที่จะเห็นหลายกรณี
Uwe Keim

คำตอบ:


207

ตามที่MSDN - มันลงหน้าในส่วน "ผู้ประกอบการ":

เมื่อคุณทำการเปรียบเทียบกับชนิดที่เป็นโมฆะถ้าค่าของประเภทใดประเภทหนึ่งเป็นโมฆะnullและอื่น ๆ ไม่ได้การเปรียบเทียบทั้งหมดจะประเมินfalseยกเว้น!=

ดังนั้นทั้งสองa > bและa < bประเมินfalseตั้งแต่aเป็นโมฆะ ...


2
ในโครงการของฉันฉันกำลังใช้ VB.NET และดูเหมือนว่าnothing <> 1= nullใน VB ในขณะที่null != 1= trueใน C # - ฉันใช้ LinqPad เพื่อทดสอบข้อความ
Luke T O'Brien

2
ฉันเพิ่งสงสัยและมันก็น่าสังเกตLifted Operatorsใน C # stackoverflow.com/questions/3370110/what-are-lifted-operators - ฉันสงสัยว่านี่อาจเป็นเหตุผลที่ VB.NET ส่งคืนผลลัพธ์ที่แตกต่าง
Luke T O'Brien

44

ในฐานะที่เป็น MSDN พูดว่า

เมื่อคุณทำการเปรียบเทียบกับชนิดที่สามารถเป็นโมฆะได้ถ้าค่าของประเภทที่เป็นโมฆะอย่างใดอย่างหนึ่งเป็นโมฆะและสิ่งอื่น ๆ ที่ไม่ใช่การเปรียบเทียบทั้งหมดจะประเมินเป็นเท็จยกเว้นสำหรับ! = (ไม่เท่ากัน) มันเป็นสิ่งสำคัญที่จะไม่คิดว่าเนื่องจากการเปรียบเทียบที่เฉพาะเจาะจงกลับเท็จ ในตัวอย่างต่อไปนี้ 10 ไม่มากกว่าน้อยกว่าหรือเท่ากับ null เฉพาะ num1! = num2 ประเมินเป็นจริง

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

เพื่อสรุป: การเปรียบเทียบความไม่เท่าเทียมกันใด ๆ กับ null ( >=, <, <=, >) ผลตอบแทนfalseแม้ว่าทั้งสองตัวถูกดำเนินการเป็นโมฆะ กล่าวคือ

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

การเปรียบเทียบความเท่าเทียมกันและไม่เท่าเทียมใด ๆ ที่มีค่า null ( ==, !=) จะทำงานตามที่คาดไว้ กล่าวคือ

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

มันเหมือนกันสำหรับทั้งสองint? nonNullและint notNull?
КоеКто

1
@ КоеКто, Nullable<NumberTypes> = nullพฤติกรรมเดียวกันสำหรับ ตรวจสอบแล้ว
Artru

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.