2009-06-18 15 views
6

सी # (3.5) मैं निम्नलिखित की कोशिश में:।मैं बाइट्स पर बुलियन तर्क क्यों नहीं कर सकता?

byte byte1 = 0x00; 
byte byte2 = 0x00; 
byte byte3 = byte1 & byte2; 

और मैं त्रुटि 132 मिलती है: 'बाइट' के लिए परोक्ष कनवर्ट नहीं कर सकता प्रकार 'int' एक स्पष्ट रूपांतरण मौजूद है "(यदि आप एक डाली याद कर रहे हैं?) "। वही होता है | और ^।

मैं क्या गलत कर रहा हूं? यह मुझे इट्स के बारे में क्यों पूछ रहा है? मैं बाइट्स पर बुलियन तर्क क्यों नहीं कर सकता?

+2

.NET में सभी अंकगणितीय int पर आधारित है। काफी चर्चा के साथ एक संबंधित सवाल है। यह आपके प्रश्न का उत्तर नहीं है, लेकिन आपको कुछ अंतर्दृष्टि मिल सकती है कि सी # सामान्य रूप से अंकगणित के साथ कैसे व्यवहार करता है: http://stackoverflow.com/questions/941584/byte-byte-int-why –

+0

"क्योंकि सी # एकदम सही नहीं है भाषा ", यह है कि मैं इसे कैसे समझाऊंगा। यह अपने मर्दों में से एक है (और अन्य भाषाओं की तुलना में, सी # अब तक कम से कम और कम से कम प्रभावशाली मौसा है ...) –

उत्तर

12

विभिन्न ऑपरेटरों को byte के लिए घोषित नहीं किया गया है - दोनों ऑपरेटरों को int पर पदोन्नत किया जाता है, और परिणाम int है। उदाहरण के लिए, इसके अलावा:

byte byte1 = 0x00; 
byte byte2 = 0x00; 
byte byte3 = byte1 + byte2; // Compilation error 

ध्यान दें कि यौगिक कार्य कार्य करते हैं:

byte1 += byte2; 

वहाँ एक recent SO question on this था। मैं मानता हूं कि यह बिटवाई ऑपरेशंस के लिए विशेष रूप से परेशान है, जहां परिणाम हमेशा एक ही आकार का होना चाहिए, और यह एक तार्किक रूप से पूरी तरह से वैध संचालन है।

समाधान के लिए, तुम सिर्फ परिणाम वापस बाइट पर कास्ट कर सकते:

byte byte3 = (byte) (byte1 & byte2); 
+0

यह अजीब बात हो सकती है कि सी # बाइट + बाइट का प्रकार "int" के रूप में मूल्यांकन करता है, अगर एक टाइपकास्ट की आवश्यकता होती है परिणाम को बाइट पर वापस असाइन करना चाहता है, लेकिन vb.net खराब है। प्रकार 'बाइट' के दो चर या परिभाषित स्थिरांक प्रकार 'बाइट' के रूप में जोड़े जाएंगे (यदि परिणाम 255 से अधिक हो तो भी मर रहा है, भले ही इसे 'इंटीजर' को असाइन किया जा रहा हो) लेकिन संख्यात्मक अक्षर जो कि किसी अन्य चीज़ के लिए उपयोग किए जाते हैं एक प्रत्यक्ष असाइनमेंट पूर्णांक के रूप में माना जाता है। यह अच्छा है, यद्यपि वह vb.net बूलेन्स को अधिकतर समझदारी से संभालता है ('x और y' का आकार होना चाहिए, लेकिन यह नहीं है कि * छोटे * हस्ताक्षरित ऑपरेंड, यदि कोई हो)। – supercat

0

क्योंकि बाइट (और कम) प्रकार उन ऑपरेटरों को लागू नहीं करते

युक्ति देखें: 4.1.5

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