byte someVar;
someVar -= 3;
वैध लेकिन
byte someVar;
someVar = someVar - 3;
नहीं है क्यों है?
byte someVar;
someVar -= 3;
वैध लेकिन
byte someVar;
someVar = someVar - 3;
नहीं है क्यों है?
आश्चर्य की बात है कि, जब आप बाइट्स पर संचालन करते हैं तो कंप्यूटेशंस int
मानों का उपयोग करके किया जाएगा, बाइट्स को पहले (int)
पर डाला जाएगा। short
एस के लिए यह भी सच है, और इसी प्रकार float
एस double
पर फ़्लोटिंग-पॉइंट अंकगणित करते समय अप-रूपांतरित हो जाते हैं।
दूसरा टुकड़ा के बराबर है:
byte someVar;
someVar = (int) someVar - 3;
क्योंकि यह आप परिणाम वापस (byte)
लिए डाली काम स्वीकार करने के लिए संकलक पाने के लिए करना चाहिए।
someVar = (byte) (someVar - 3);
यहाँ CLI विनिर्देश (ECMA 335) यह बताता है कि जो ऑपरेंड ग्रुप ए सेशन बी, जहां ए और बी ऑपरेंड और "सेशन" कर रहे हैं की बाइनरी संख्यात्मक ऑपरेटरों पर मान्य हैं में एक टेबल की एक प्रति है
कुछ टिप्पणियां इस के साथ की आवश्यकता है::
नोट पंक्ति और एफ के लिए स्तंभ, दोनों ऑपरेंड चल जाना चाहिए बिंदु, तुम नहीं सीधे, किसी पूर्णांक एक डबल करने के लिए जोड़ सकते हैं कहते हैं,। सी # कंपाइलर स्वचालित रूप से इंट ऑपरेंड को दोबारा परिवर्तित करके उस सीमा से संबंधित है ताकि ऑपरेटर मान्य हो।
आपके प्रश्न के लिए प्रासंगिक: यह भी ध्यान दें कि बाइट, sbyte, char, short और ushort प्रकार मौजूद नहीं हैं। वही दृष्टिकोण, कंपाइलर ऑपरेटरों को सबसे छोटे प्रकार में परिवर्तित करता है जो मूल्य का प्रतिनिधित्व कर सकता है ताकि ऑपरेटर का उपयोग किया जा सके। जो int32 होगा। तालिका के अनुसार, ऑपरेशन का परिणाम int32 होगा।
अब यहां रगड़ है: नतीजा int32 है लेकिन इसे बाइट वैल्यू पर वापस सौंपने के लिए एक संकीर्ण रूपांतरण की आवश्यकता होती है। 32 बिट्स से 8 बिट्स तक। यह मुसीबत है क्योंकि यह महत्वपूर्ण बिट्स खो देता है। सी # कंपाइलर के लिए आपको यह स्पष्ट करने की आवश्यकता है। आप अनिवार्य रूप से स्वीकार करते हैं कि आप जानते हैं कि आप क्या कर रहे हैं और आप संभावित आश्चर्यजनक परिणाम से अवगत हैं।इस तरह:
byte v = 255;
v = (byte)(v + 1);
- = ऑपरेटर कि आवश्यक डाली लागू करने के लिए कोई प्रभावी तरीका है क्योंकि वहाँ एक समस्या है। यह भाषा वाक्यविन्यास में व्यक्त नहीं है। (बाइट) 3 का उपयोग करना समझ में नहीं आता है, ऑपरेटर को काम करने के लिए शाब्दिक int32 में परिवर्तित हो जाता है।
उन्होंने समस्या को पछाड़ दिया, संकलक स्वचालित रूप से आपकी मदद के बिना कलाकारों को उत्सर्जित करता है।
यह बताता है कि मैं अलग-अलग प्रकार के बीच प्रतिबिंबित करने के लिए प्रतिबिंब का उपयोग करने में असमर्थ क्यों हूं। – fusi
कोई व्यक्ति सत्यापित कर सकता है कि टाइप कास्टिंग कुछ स्तर- = 3 में आईएल स्तर पर होता है; उदाहरण? क्या यह एक ही आईएल कोड उत्पन्न करता है? – Dested
मैंने अभी परावर्तक के साथ जांच की है। '- =' ऑपरेटर आईएल स्तर पर 'conv.u1' उत्पन्न करता है, यही कारण है कि पहला स्निपेट –
@Dested काम कर रहा है सटीक नियम सी # भाषा विशिष्टता में दिए गए हैं। यह बताता है: _ "उपरोक्त दूसरा नियम 'x op = y' को कुछ संदर्भों में' x = (टी) (x op y)' के रूप में मूल्यांकन करने के लिए अनुमति देता है। नियम मौजूद है कि पूर्वनिर्धारित ऑपरेटरों को यौगिक ऑपरेटरों के रूप में उपयोग किया जा सकता है जब बाएं ऑपरेंड प्रकार 'sbyte', 'बाइट',' शॉर्ट', 'ushort', या' char' प्रकार का होता है। यहां तक कि जब दोनों तर्क एक प्रकार के होते हैं, तो पूर्वनिर्धारित ऑपरेटर प्रकार 'int' जैसा कि §7.3.6.2 में वर्णित है। इस प्रकार, बिना किसी कलाकार के बाएं ऑपरेंड को परिणाम असाइन करना संभव नहीं होगा। "_ –