मैं निम्नलिखित कोड के लिए बहुत ही अजीब सी # संकलक व्यवहार पाया है:अजीब सी # संकलक व्यवहार (अधिभार संकल्प)
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) के साथ किसी भी विधि अधिभार के लिए एक समस्या प्रतीत होता है।
बस एक विचार, क्या होता है जब अधिकतम करने के लिए चेतावनी स्तर की स्थापना? शायद यह इस मामले में इसके बारे में चेतावनी देगा। – dowhilefor
हाँ, मुझे मिल गया है। मेरा सवाल है: यह केवल 0 के लिए क्यों काम करता है? –
@VictorHaydin, क्योंकि spec ऐसा कहता है ... "एक अंतर्निहित गणना रूपांतरण दशमलव-पूर्णांक-शाब्दिक 0 को किसी भी enum-type में परिवर्तित करने के लिए अनुमति देता है और किसी भी नामुमकिन प्रकार के जिसके अंतर्निहित प्रकार एक enum-type है"। अब, मुझे नहीं पता कि यह इस तरह से क्यों डिजाइन किया गया था, लेकिन शायद एक अच्छा कारण है ... आपको किसी को सी # टीम से पूछना होगा। –