2009-12-14 12 views
5

अगला उदाहरण सिस्टम को क्यों फेंकता है। ऑरे टाइप टाइपमिशन अपवाद?क्यों Inumerable की ToArray() एक्सटेंशन विधि ArrayTypeMismatchException फेंकता है?

New Int16(){4,5,6}.Cast(of UInt16).ToArray() 

मैं उम्मीद है कि इस लाइन युक्त 4,5 और 6

अग्रिम धन्यवाद एक UInt16 सरणी लौट आए।

उत्तर

7

यह Cast या ToArray में एक बग है,: आप इस कोशिश कर सकते। इस उत्तर में कोड सी # में है, लेकिन उम्मीद है कि आप देख सकते हैं कि यह क्या है :)

मेरा मानना ​​है कि Cast पहले यह देखने का प्रयास करता है कि कोई साधारण संदर्भ रूपांतरण काम करेगा या नहीं - यानी जहां यह वही संदर्भ वापस कर सकता है।

उदाहरण के लिए:

String x = "hello"; 
IEnumerable<char> y = x.Cast<char>(); 
Console.WriteLine(object.ReferenceEquals(x, y)); // Prints true 

दुर्भाग्य से, यह ऐसा करता है संगतता के लिए CLR नियमों का उपयोग कर - जिसके तहत UInt16[] और Int16[] संगत हैं। यही कारण है कि इस घटना की ओर जाता है:

short[] array = new short[]{4, 5, 6}; 
IEnumerable<ushort> cast = array.Cast<ushort>(); 
Console.WriteLine(object.ReferenceEquals(array, cast)); // Prints True 

दुर्भाग्य से अगर तुम तो ToArray() कॉल करने के लिए प्रयास करते हैं, यह खुश नहीं है:

// Explicit type argument just for clarity 
cast.ToArray<ushort>(); // Bang 

ToArray कोई संदेह नहीं है कुछ अनुकूलन करने की कोशिश करता है - जो क्योंकि इस विशेष मामले में विफल रहता है टाइप वह नहीं है जो वास्तव में यह अपेक्षा करता है।

मेरा मानना ​​है कि सही व्यवहार Cast एक आलसी इटरेटर वापस जाने के लिए के लिए होना चाहिए, लेकिन उस के लिए विफल जब यह बाद में निष्पादित करता है। ऐसा होता है यदि आप उदाहरण के लिए Int16 से Int32 पर जाने का प्रयास करते हैं।

अब, वास्तव में पर वापस जाने के लिए: Select कॉल का उपयोग करें। Cast केवल अनबॉक्सिंग संचालन और संदर्भ प्रकार रूपांतरणों के लिए होना है।

+0

धन्यवाद, दुर्भाग्य से मुझे LINQ के बारे में अभी भी कोई जानकारी नहीं है और मुझे हमेशा ज़रूरी चीजें होती हैं, आपको पता है। वैसे भी फिर से धन्यवाद। –

5

क्योंकि Int16 और UInt16 विभिन्न प्रकार हैं। IMO

New Int16() {4, 5, 6}.Select(Function(x) CType(x, UInt16)).ToArray() 
+0

यही कारण है कि मैं कास्ट को बुला रहा हूं, है ना? अगर वे वही प्रकार कास्ट की आवश्यकता होगी। –

+0

'कास्ट' केवल तभी काम करता है जब प्रकार संगत होते हैं (एक दूसरे से निकलता है)। 'Int16' और' UInt16' में कुछ भी सामान्य नहीं है। –

+0

ठीक है, तो क्या डायरेक्टकास्ट के बजाय सीटीपी के साथ एक ही चीज़ करने का कोई तरीका है? –

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