2010-08-19 8 views
11

मुझे TryCast का यह व्यवहार .NET 4.0/VS 2010 में भ्रमित करने के बजाय मिलता है।TryCast विफल रहता है जहां डायरेक्टकास्ट काम करता है (.NET 4.0)

मेरी समझ में TryCast DirectCast की तरह काम करता है, लेकिन यदि कोई कलाकार संभव नहीं है तो अपवाद फेंकने के बजाय कुछ भी नहीं लौटाएगा।

VS 2010/नेट 4

?TryCast(CType(1, Object), String) 
Nothing 
?DirectCast(CType(1, Object), String) 
"1" 

वी.एस. 2008/नेट 3,5

?TryCast(CType(1, Object), String) 
Nothing 
?DirectCast(CType(1, Object), String) 
Cannot convert to 'String'. 

.NET 3.5 परिणाम है कि मैं क्या विश्वास है TryCast करता है के साथ संगत कर रहे हैं ... हालांकि .NET 4 नहीं है।

क्या कोई मुझे कृपया .NET 4 में स्ट्रिंग में ऑब्जेक्ट को सुरक्षित रूप से डालने के लिए सबसे अच्छी दिशा में इंगित कर सकता है?

उत्तर

16

? से शुरू होने वाले आपके कोड नमूने के आधार पर मुझे लगता है कि आप अपना परीक्षण सही करने के लिए तत्काल विंडो का उपयोग कर रहे हैं? इस दृष्टिकोण के साथ समस्या यह है कि तत्काल खिड़की वास्तविक मूल्यांकन के बजाय एक व्याख्या है। यह सूक्ष्म कोने के मामले कीड़े के लिए अतिसंवेदनशील छोड़ देता है और यह वास्तव में उनमें से एक है।

यदि आप अपना नमूना कोड लेते हैं और इसे एक साधारण VB.Net कंसोल एप्लिकेशन में जोड़ते हैं तो आप पाएंगे कि 2010 का व्यवहार 2008 के व्यवहार के समान है (अपवाद फेंकता है)।

संपादित

तो क्यों इस प्रतिगमन हुआ? 2010 में मैं पूरी तरह से वीबी ईई डीबगिंग इंजन (अभिव्यक्ति मूल्यांकनकर्ता) को फिर से लिखता हूं। विरासत में मिला गया पुराना कोड बेस अब और भी बनाए रखने के लिए बहुत महंगा था। इस बिंदु पर कि इंजन में नई विशेषताएं जोड़ना अधिक महंगा था जो इसे एक बेहतर आर्किटेक्चर के साथ स्क्रैच से पुनः लिख रहा था जिसमें नई विशेषताएं शामिल थीं।

डीबगिंग मूल्यांकन से पहले कहा गया है कि कोड के निष्पादन से अधिक व्याख्या है। यह ईई और सीएलआर/कंपाइलर के बीच कुछ एल्गोरिदम के दोहराव को मजबूर करता है। उन क्षेत्रों में से एक जहां डुप्लिकेशंस होता है कास्टिंग तर्क में होता है। डीबग टाइम ऑब्जेक्ट डालने के लिए सीएलआर डीबगर से पूछने का कोई तरीका नहीं है, यह निर्धारित करने के लिए ईई की ज़िम्मेदारी है कि भाषा निर्दिष्ट कास्ट वास्तव में मान्य है या नहीं।

पुराने ईई कास्टिंग तर्क में कई कीड़े थी (विशेष रूप से जेनेरिक और सरणी के क्षेत्र में)। नया आधारभूत संरचना सीएलआर दिशानिर्देशों के बहुत करीब से अनुरूप है। हालांकि आपके पास 100% समानता नहीं होगी क्योंकि यह ईई में बहुत उपयोगी अभिव्यक्तियों को अस्वीकार कर देगी (मैं भविष्य में इस पर एक ब्लॉग पोस्ट लिख सकता हूं)। लेकिन ज्यादातर मामलों के लिए व्यवहार रखता है।

इस विशेष उदाहरण में मैंने एक सूक्ष्म बग जोड़ा जो वीबी के रनटाइम रूपांतरण ऑपरेटरों बनाम निर्दिष्ट व्यवहार के लिए Object पर टाइप किए गए मान के डायरेक्टकास्ट की अनुमति देता है जो केवल सीएलआर रूपांतरणों की अनुमति देता है। इसलिए यह रूपांतरण सफल होता है जहां यह असफल होना चाहिए।

+0

मैंने अभी पुष्टि की है कि आपने क्या सुझाव दिया है। वास्तविक मूल्यांकन में चलाए जाने पर डायरेक्टकास्ट() वास्तव में एक अपवाद फेंक देता है। स्पष्टीकरण के लिए धन्यवाद! – motto

+0

यदि आप वास्तव में क्या समझा सकते हैं तो यह वास्तव में साफ होगा। – SLaks

+0

@ एसएलएक्स ने एक त्वरित स्पष्टीकरण जोड़ा। – JaredPar

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