2011-11-22 21 views
11

मैं निम्नलिखित कोड के लिए बहुत ही अजीब सी # संकलक व्यवहार पाया है:अजीब सी # संकलक व्यवहार (अधिभार संकल्प)

Expected: 0 
    But was: null 

मुझे समझ में क्यों:

var p1 = new SqlParameter("@p", Convert.ToInt32(1)); 
    var p2 = new SqlParameter("@p", 1); 
    Assert.AreEqual(p1.Value, p2.Value); // PASS 

    var x = 0; 
    p1 = new SqlParameter("@p", Convert.ToInt32(x)); 
    p2 = new SqlParameter("@p", x); 
    Assert.AreEqual(p1.Value, p2.Value); // PASS 

    p1 = new SqlParameter("@p", Convert.ToInt32(0)); 
    p2 = new SqlParameter("@p", 0); 
    Assert.AreEqual(p1.Value, p2.Value); // FAIL!? 

अंतिम पंक्ति दर्शाते हैं उनमें निम्न संदेश के साथ विफल रहता है परीक्षण विफल रहता है: p2 = new SqlParameter("@p", 0);SqlParameter(string, SqlDbType) और अन्य मामलों के लिए SqlParameter(string, object) के रूप में हल किया गया है। लेकिन मुझे समझ में नहीं आता कि ऐसा क्यों होता है। मेरे लिए यह एक बग की तरह दिखता है, लेकिन मुझे विश्वास नहीं है कि सी # कंपाइलर में ऐसी तरह की बग हो सकती है।

इसके लिए कोई कारण?

पीएस यह enum पैरामीटर और 0 मान (SqlDbType enum) के साथ किसी भी विधि अधिभार के लिए एक समस्या प्रतीत होता है।

उत्तर

11

असल में, दशमलव पूर्णांक अक्षर 0 सभी enum प्रकारों (सी # 4 spec §6.1.3) के लिए पूरी तरह से परिवर्तनीय है, इसलिए संकलक निर्धारित करता है कि SqlParameter(string, SqlDbType) एक लागू फ़ंक्शन सदस्य है। फिर इसे दो उम्मीदवारों के सदस्यों के बीच बेहतर चुनना होगा, और यह SqlParameter(string, SqlDbType)SqlParameter(string, object) से अधिक चुनता है, क्योंकि SqlDbTypeobject (§7.5.3.2) से अधिक विशिष्ट प्रकार है।

लेकिन मैं मानता हूँ कि उस मामले में यह बहुत भ्रामक है ...

+0

बस एक विचार, क्या होता है जब अधिकतम करने के लिए चेतावनी स्तर की स्थापना? शायद यह इस मामले में इसके बारे में चेतावनी देगा। – dowhilefor

+0

हाँ, मुझे मिल गया है। मेरा सवाल है: यह केवल 0 के लिए क्यों काम करता है? –

+5

@VictorHaydin, क्योंकि spec ऐसा कहता है ... "एक अंतर्निहित गणना रूपांतरण दशमलव-पूर्णांक-शाब्दिक 0 को किसी भी enum-type में परिवर्तित करने के लिए अनुमति देता है और किसी भी नामुमकिन प्रकार के जिसके अंतर्निहित प्रकार एक enum-type है"। अब, मुझे नहीं पता कि यह इस तरह से क्यों डिजाइन किया गया था, लेकिन शायद एक अच्छा कारण है ... आपको किसी को सी # टीम से पूछना होगा। –

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