2015-10-21 11 views
13

के बीच अजीब अंतर मैं एक कोड.NET 3.5 और .net 4.0

byte[] bytes = new byte[] { 0x80, 1, 192, 33, 0 }; 

if (bytes[0] != 0x80 || ((bytes[1] & ~1) != 0) || bytes[4] != 0) 
{ 
//signature wrong (.net 4.0 result) 
} 
else 
{ 
//signture okay (.net 3.5 result) 
} 

.net 3.5 अभिव्यक्ति में मूल्यांकन करता मिल गया है के रूप में झूठी है, लेकिन 4.0 में यह रूप में सही मूल्यांकन करता है। मेरा सवाल है क्यों? और इस व्यवहार को रोकने के लिए मैं अपने पुराने (.net 3.5) कोड को कैसे देख सकता हूं?

+0

क्या आप इस स्थिति को विभाजित कर सकते हैं ताकि अंतर पैदा हो सके? – Diego

+0

सबसे अजीब चीज - तो मैं वॉच विंडो (.NET 3.5 और 4.0 के लिए दोनों) में इस अभिव्यक्ति को उजागर करता हूं। मुझे मिला है: बाइट्स [0]! = 0x80 \t झूठा \t बूल (बाइट्स [1] & ~ 1)! = 0) \t झूठी \t बूल बाइट्स [4]! = 0 \t झूठी \t बूल (बाइट्स [0]! = 0x80 || ((बाइट्स [1] और ~ 1)! = 0) | | बाइट्स [4]! = 0) \t झूठी \t बूल – qmor

+0

कौन सा सही है? –

उत्तर

4

इसलिए टिप्पणियों में यह खो नहीं गया है, मेरा मानना ​​है कि आपने 64 बिट अनुप्रयोगों के लिए .NET 4.6 में नया जेआईटी कंपाइलर RyuJIT में एक बग मारा है।

यह पहला नहीं है, उदाहरण के लिए this blog post देखें कि स्टैक ओवरफ़्लो टीम ने एक और समस्या को कैसे ट्रैक किया।

के रूप में टिप्पणी में चर्चा की, यह शुरू हो रहा है नहीं करता है, तो आप .NET 3.5 लक्षित करते हैं, और न ही अगर आप नेट 4.

में 86 को लक्षित इस बग या अभी तक माइक्रोसॉफ्ट को सूचित नहीं हो सकता है हो सकता है किया गया - अगर किसी के लिए किसी बग रिपोर्ट के बारे में पता है, या अंतर्निहित कारण को ट्रैक करने के लिए .NET 4.6 स्थापित है, तो संपादित करने के लिए स्वतंत्र महसूस करें।

+0

इस सीडब्ल्यू को बनाया क्योंकि यह एक महत्वपूर्ण मुद्दा हो सकता है, इसलिए यदि कोई अधिक जानकारी प्राप्त करता है तो कोई भी अपडेट करने के लिए स्वतंत्र महसूस करता है। –

+0

यह देखने के लिए आगे नहीं खोया जा सकता है कि इस समय यह कैसे संबंधित है, लेकिन निक क्रेवर (स्टैक ओवरफ़्लो का - ऊपर ब्लॉग लिंक देखें) [पुष्टि] है [https://twitter.com/nick_craver/status/656872674245914624) ryujit पर बिट बुद्धिमान सामान के साथ कम से कम _some_ मुद्दे हैं। –