2010-07-29 10 views
6

जब this question जवाब देने के लिए कोशिश कर रहा है, मैं निम्नलिखित की खोज:कास्टिंग और Linq कास्ट <T>()

string s = "test"; 

var result1 = s.Select(c => (ushort)c); // works fine 

var result2 = s.Cast<ushort>(); // throws an invalid cast exception 

क्यों Cast<T>() यहाँ असफल रहा है? क्या फर्क पड़ता है?

उत्तर

12

लगता है कि तुम यहां अपना उत्तर मिल जाएगा:

Puzzling Enumerable.Cast InvalidCastException

अंतिम भाग में, संपादित करें के तहत:

Cast<T>() बजाय IEnumerable IEnumerable<T> पर एक विस्तार विधि है। इसका मतलब है कि समय से प्रत्येक मान बिंदु जहां यह जा रहा डाली, यह पहले से ही वापस में एक System.Object

+1

धन्यवाद मार्टिन बॉक्सिंग कर दिया गया है है करने के लिए हो जाता है। यह तो दिलचस्प है. तो कास्ट शायद निहित मुक्केबाजी प्रदर्शन दंड के लिए किसी भी तरह से बचा जाना चाहिए। मुझे आश्चर्य है कि एमएसडीएन का उल्लेख कहीं भी नहीं है (जो भी मुझे मिल सकता है)। – fearofawhackplanet

+5

'कास्ट ' का उपयोग केवल 'IENumerable' को 'IENumerable ' के स्तर तक लाने के लिए किया जाना है, जहां अन्य सभी LINQ ऑपरेटरों को परिभाषित किया गया है। 'IENumerable 'लेना और इसे' IENumerable 'में परिवर्तित करना एक प्रक्षेपण है, जो' चयन' द्वारा किया जाता है। तथ्य यह है कि 'कास्ट'' IENumerable 'पर भी संभव है, क्योंकि' IENumerable ''IENumerable' से विरासत है - कोई अन्य कारण नहीं है। –