2011-10-05 17 views
33

के साथ गणित संचालन कृपया बताएं कि यह परीक्षण क्यों गुजरता है?शून्य

[Test] 
public void TestNullOps() 
{ 
    Assert.That(10/null, Is.Null); 
    Assert.That(10 * null, Is.Null); 
    Assert.That(10 + null, Is.Null); 
    Assert.That(10 - null, Is.Null); 
    Assert.That(10 % null, Is.Null); 
    Assert.That(null/10, Is.Null); 
    Assert.That(null * 10, Is.Null); 
    Assert.That(null + 10, Is.Null); 
    Assert.That(null - 10, Is.Null); 
    Assert.That(null % 10, Is.Null); 

    int zero = 0; 
    Assert.That(null/zero, Is.Null); 
} 

मुझे समझ में नहीं आता कि यह कोड कैसे संकलित करता है।

शून्य गणित Nullable<T> (उदा। 10/nullNullable<int>) के साथ प्रत्येक गणित अभिव्यक्ति की तरह दिखता है। लेकिन मुझे ऑपरेटर विधियों को Nullable<T> कक्षा में नहीं दिख रहा है। यदि इन ऑपरेटरों को int से लिया जाता है, तो अंतिम दावा क्यों विफल नहीं होता है?

उत्तर

26
MSDN से

:

पूर्वनिर्धारित एकल और द्विआधारी ऑपरेटरों और किसी भी उपयोगकर्ता परिभाषित ऑपरेटरों कि मूल्य प्रकार के लिए मौजूद हैं भी नल प्रकार के द्वारा प्रयोग किया जा सकता है। ऑपरेटर शून्य होने पर ये ऑपरेटर शून्य मूल्य का उत्पादन करते हैं; अन्यथा, ऑपरेटर परिणाम की गणना करने के लिए निहित मान का उपयोग करता है।

यही कारण है कि सभी परीक्षण पास किए गए हैं, अंतिम बात सहित - कोई फर्क नहीं पड़ता कि ऑपरेंड मूल्य क्या है, यदि कोई अन्य ऑपरेंड null है, तो परिणाम null है।

+5

ध्यान दें कि '==' के पास थोड़ा अलग नियम हैं; यदि * दोनों * शून्य हैं, तो यह 'सत्य' –

+4

हाँ है, और यह वही है जहां तक ​​मुझे पता है - यदि कोई जानता है - और कोई दूसरा नहीं है, तो परिणाम 'सत्य' है। – Andrei

13

Nullable<T> के लिए ऑपरेटर तथाकथित "उठाए गए" ऑपरेटर हैं; सी # कंपाइलर ऑपरेटरों को T के लिए उपलब्ध कराता है और पूर्व परिभाषित नियमों का एक सेट लागू करता है; उदाहरण के लिए, + के साथ, उठाए गए +null हैं यदि कोई ऑपरेंड शून्य है, अन्यथा आंतरिक मानों का योग। आखिरी बार; फिर, विभाजन को null के रूप में परिभाषित किया गया है यदि कोई ऑपरेंड null है - यह विभाजन विभाजन नहीं करता है।

+0

क्या यह हो सकता है कि संकलक बस इसे किसी अन्य रूप में अनुवादित कर सके? मेरा जवाब देखें –

+0

@ मार्टिन मैंने पहले से ही आपके उत्तर पर टिप्पणी की है; पी –

+1

@MarcGravell अगर विभाजन कभी नहीं किया जाता है, तो क्यों संकलक 'Assert संकलित नहीं करता है। वह (शून्य/0, Is.Null); '? – altso

1

मुझे लगता है कि कंपाइलर zero से Nullable<int> परिवर्तित करता है, और अंतर्निहित डिवीजन ऑपरेटर प्रदान करता है। चूंकि Nullable प्रकार शून्य हो सकता है, 0 से विभाजन संकलन के दौरान पकड़ा नहीं जाता है। सबसे अच्छा अनुमान यह है कि वे चाहते हैं कि आप उन मामलों में शून्य परीक्षण कर सकें जहां div/0 हो रहा है।

1

मैं परावर्तक

var myValue = 10/null; 

का उपयोग कर नीचे कोड से उत्पन्न कोड को देखने की कोशिश की और संकलक इस में बदल जाता:

int? myValue = null; 

और यह अभ्यस्त संकलन है, तो आप नहीं कर सकते यह चाल:

object myNull = null; 
var myValue = 10/myNull; 
+0

हां, लेकिन यह सिर्फ प्रश्न को पुनर्स्थापित करता है, क्योंकि ** दोनों मामलों में ** यह संकलक ऐसा कर रहा है (उसी नियमों का उपयोग करके) - बस, यह इस मामले में निरंतर मूल्य के रूप में ऐसा करने में सक्षम होता है। –

+0

हाँ, स्थिरांक के बारे में सुझाव के लिए धन्यवाद। – altso

1

इस सूची में संचालन हमेशा वापस आते हैं:

1 + 2 + 3 + NULL 

5 * NULL - 7 

'Home ' || 'sweet ' || NULL 

MyField = NULL 

MyField <> NULL 

NULL = NULL 
+0

ध्यान दें कि लिंक-केवल उत्तर ही निराश होते हैं (लिंक समय के साथ बासी हो जाते हैं)। कृपया अपना उत्तर संपादित करने और यहां एक सारांश जोड़ने पर विचार करें। – bummi

+0

धन्यवाद मुझे सही करने के लिए बुमी! – Sohil

+0

यह मेरे लिए सी # जैसा नहीं दिखता है। यह कौनसी भाषा है? – Sam

संबंधित मुद्दे