2015-10-07 9 views
5

मैं कोड है कि मुझे VS2015 में एक चेतावनी संदेश (CS0675) देने की एक पंक्ति है पर ऑपरेटर, लेकिन 2013.कंपाइलर या गलतफहमी में बग? या शॉर्ट्स

shortValue |= (short)anEnum; 

चेतावनी CS0675 बिटवाइस-या ऑपरेटर में नहीं एक sign- पर इस्तेमाल किया विस्तारित ऑपरेंड; पहले एक छोटे से हस्ताक्षरित प्रकार को कास्टिंग करने पर विचार करें। कंपाइलर स्पष्ट रूप से विस्तृत और एक चर को बढ़ाया गया, और उसके बाद परिणामी मान को थोड़ा सा या ऑपरेशन में उपयोग किया गया। इसका परिणाम अप्रत्याशित व्यवहार हो सकता है।

जाहिर है कि क्या हो रहा है enum और छोटा एक int, या ऑपरेटर को बढ़ाया जा रहा है, और उसके परिणामस्वरूप परिणाम को कम से कम सौंपा गया।

यदि मैं shortValue = shortValue | (short)anEnum; पर कोड बदलता हूं तो मुझे एक संकलक त्रुटि CS0266 मिलती है। लेकिन थोड़ा सा या शॉर्ट्स के लिए मान्य होना चाहिए (दोनों मामलों में मुझे विश्वास है)। यदि मैं | पर माउस को घुमाता हूं तो यह एक इंट ऑपरेटर के रूप में दिखाता है, क्या मुझे कुछ याद आ रहा है या क्या मुझे इसे बग के रूप में रिपोर्ट करना चाहिए?

पीएस: मुझे पता है कि |= के बजाय = का उपयोग कर चेतावनी/त्रुटि को समाप्त कर सकते हैं और परिणाम को संक्षिप्त में कास्ट कर सकते हैं।

+1

यह भी देखें [बिट स्टूडियो 2015 में साइन-विस्तारित ऑपरेंड पर उपयोग किए गए ऑपरेटर/या ऑपरेटर] (http://stackoverflow.com/questions/31542256/) और अन्य थ्रेड। –

+0

यह वीएस2015 में एक बग है और इसे VS2015 अपडेट 1 में ठीक किया जाएगा। Https://github.com/dotnet/roslyn/issues/4027 देखें। –

उत्तर

5

आप (विशेष रूप से "पूर्णांक तार्किक ऑपरेटरों" में) सी # विनिर्देशों को देखो, तो आप देखेंगे कि वहाँ केवल int के लिए एक परिभाषा uint, long, तार्किक OR ऑपरेटर के लिए ulong:

int operator |(int x, int y); 
uint operator |(uint x, uint y); 
long operator |(long x, long y); 
ulong operator |(ulong x, ulong y); 

इसके अलावा, Bit twiddling: What does warning CS0675 mean? में एरिक Lippert कहा गया है कि:

"वहाँ रहे हैं बिटवाइज़-या ऑपरेटरों int पर परिभाषित, uint, +०१२३४९८००३७और ulong "

ऑपरेटर short के लिए मान्य है, लेकिन केवल इस अर्थ में कि कम मूल्य int लिए बढ़ाया जा सकता है। हालांकि, उस ऑपरेटर का रिटर्न वैल्यू (कम से कम) int है।

तो, तकनीकी तौर पर, चश्मा के अनुसार, इस |= का उपयोग कर जो एक चेतावनी और नियमित रूप से | परिणाम एक int में है कि होने की जरूरत है देता है int करने के लिए हस्ताक्षर किए मूल्य, का विस्तार करता है के रूप में एक बग हो प्रतीत नहीं होता है short को असाइन करने के लिए नीचे डाला गया।

हालांकि, क्योंकि संकलक वास्तव में पता कर सकते हैं कि दोनों ऑपरेंड मूल रूप से कर रहे हैं short रों, दोनों int के लिए बढ़ा दिया हो और परिणाम अंततः एक short में वापस यह वास्तव में कोई फर्क नहीं पड़ता कि ऑपरेंड बढ़ाया जाता है संग्रहीत किया जाएगा । विस्तार int से short तक कास्ट द्वारा खो जाएगा।

तो, या तो वीएस2013 कंपाइलर वीएस2015 की तुलना में इसकी चेतावनियों के साथ बेहतर था या वीएस2015 एक बग को हल करता है और चेतावनी देता है कि वीएस2013 विफल रहा। केवल कंपाइलर के पीछे वाले लोग इसका उत्तर दे सकते हैं लेकिन मुझे लगता है कि यह वास्तव में एक बग है (संपादित करें: and it is)।

+0

मुझे लगता है कि मैं इसे किसी भी तरह की बग के रूप में रिपोर्ट करूंगा, क्योंकि 2015 में चेतावनी या त्रुटि के बिना | = 2013 का कोई तरीका नहीं है, लेकिन 2013 इससे खुश था (इसलिए या तो 2013 में यह एक बग था, या वे जानबूझकर दबाए गए थे त्रुटि, और मुझे बाद में संदेह है)। – jmoreno

+0

@jmoreno मैं वास्तव में इसे एक बग नहीं कहूंगा, लेकिन मैं सहमत हूं कि वीएस2013 यहां है और वीएस2015 नहीं है। मैंने इसका उत्तर देने के लिए उत्तर को थोड़ा सा अद्यतन किया है। – i3arnon

+2

@jmoreno और यह स्पष्ट रूप से तय किया गया था: https://github.com/dotnet/roslyn/issues/4027 – i3arnon

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