यह 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
केवल अनबॉक्सिंग संचालन और संदर्भ प्रकार रूपांतरणों के लिए होना है।
स्रोत
2009-12-14 12:37:11
धन्यवाद, दुर्भाग्य से मुझे LINQ के बारे में अभी भी कोई जानकारी नहीं है और मुझे हमेशा ज़रूरी चीजें होती हैं, आपको पता है। वैसे भी फिर से धन्यवाद। –