तुलना ऑपरेटर शून्य इंट के साथ कैसे काम करता है?


151

मैं अशक्त प्रकार सीखना शुरू कर रहा हूं और निम्नलिखित व्यवहार में भाग गया।

अशक्त 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 Fiddle है।
उवे कीम

जवाबों:


207

MSDN के अनुसार - यह "ऑपरेटर्स" सेक्शन में पेज के नीचे है:

जब आप अशक्त प्रकारों के साथ तुलना करते हैं, यदि अशक्त प्रकारों में से एक का मान है nullऔर दूसरा नहीं है, तो सभी तुलनाओं को falseछोड़कर!=

तो दोनों a > bऔर a < bके falseबाद से मूल्यांकन aशून्य है ...


2
अपनी परियोजनाओं में मैं वर्तमान में VB.NET का उपयोग कर रहा हूं और ऐसा लगता है कि nothing <> 1= nullVB में null != 1= जबकि trueC # में - मैं लाइनक्पैड का उपयोग बयानों का परीक्षण करने के लिए कर रहा हूं
ल्यूक टी ओ ब्रायन

2
मुझे बस आश्चर्य हुआ, और यह Lifted OperatorsC # stackoverflow.com/questions/3370110/what-are-lifted-operators के बारे में ध्यान देने योग्य है - मुझे आश्चर्य हुआ कि क्या यह कारण हो सकता है कि VB.NET अलग-अलग परिणाम लौटाए
ल्यूक ओ'ब्रायन

44

जैसा MSDN कहता है

जब आप अशक्त प्रकारों के साथ तुलना करते हैं, यदि अशक्त प्रकारों में से एक का मान अशक्त है और दूसरा नहीं है, तो सभी तुलनाएँ केवल (= बराबर नहीं) को छोड़कर असत्य का मूल्यांकन करती हैं। यह मान लेना महत्वपूर्ण नहीं है कि क्योंकि कोई विशेष तुलना झूठी होती है, विपरीत स्थिति सही होती है। निम्नलिखित उदाहरण में, 10 से अधिक नहीं है, कम से कम है, और न ही शून्य के बराबर है। केवल 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

संक्षेप में: अशक्त के साथ किसी भी असमानता तुलना ( >=, <, <=, >) देता है false, भले ही दोनों ऑपरेंड अशक्त हैं। अर्थात

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

अशक्त (या ==, !=) के साथ किसी भी समानता या गैर-समानता की तुलना 'अपेक्षित' के रूप में काम करती है। अर्थात

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

क्या यह दोनों int? nonNullऔर के लिए समान है int notNull?
К Кее Кто

1
@ КоеКто, उसी व्यवहार के लिए है Nullable<NumberTypes> = null। सत्यापित।
आर्ट्रू

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.