2012-03-26 12 views
10

मान लीजिए कि मेरे पास IEnumerable<int> है और मैं चाहता हूं कि इन्हें उनके ASCII- समकक्ष वर्णों में परिवर्तित किया जाए।IENumerable.Cast() बनाम IENumerable में कास्टिंग। चयन करें()

एक पूर्णांक के लिए, यह केवल (char)i होगा, इसलिए हमेशा collection.Select(i => (char)i) होता है, लेकिन मैंने सोचा कि यह collection.Cast() का उपयोग करने के लिए एक टैड क्लीनर होगा।

क्या कोई बता सकता है कि मुझे InvalidCastException क्यों मिलता है जब मैं collection.Cast<char>() का उपयोग करता हूं लेकिन collection.Select(i => (char)i) के साथ नहीं?

संपादित करें: दिलचस्प है, जब मैं collection.OfType<char>() पर कॉल करता हूं तो मुझे एक खाली सेट मिलता है।

उत्तर

10

Cast<T> और OfType<T> विधियां केवल संदर्भ और अनबॉक्सिंग रूपांतरण करती हैं। इसलिए वे एक मान प्रकार को दूसरे मान प्रकार में परिवर्तित नहीं कर सकते हैं।

विधियां गैर-जेनेरिक IEnumerable इंटरफ़ेस पर संचालित होती हैं, इसलिए वे अनिवार्य रूप से IEnumerable<object> से IEnumerable<T> में परिवर्तित हो रहे हैं। इसलिए, IEnumerable<int> से IEnumerable<char> में कनवर्ट करने के लिए आप Cast<T> का उपयोग नहीं कर सकते हैं, यही कारण है कि आप int को char पर बॉक्स नहीं लगा सकते हैं।

अनिवार्य रूप से, अपने उदाहरण में Cast<char> विफल रहता है क्योंकि निम्नलिखित में विफल रहता है:

object ascii = 65; 
char ch = (char)ascii; <- InvalidCastException 

देखें जॉन स्कीट उत्तम EduLinq post अधिक जानकारी के लिए।

+0

धन्यवाद! किंडा काउंटर-अंतर्ज्ञानी, लेकिन यह समझ में आता है – hehewaffles

+0

जॉन स्कीट के ब्लॉग का लिंक टूटा हुआ प्रतीत होता है। यहां एक वैकल्पिक है: http://edulinq.googlecode.com/hg/posts/33-CastAndOfType.html –

+0

@ टाइलर गिल, यह लिंक भी टूटा हुआ है – 3per

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