2009-12-08 6 views
6

संभावित डुप्लिकेट:
Enumerable.Cast<T> extension method fails to cast from int to long, why ?
Puzzling Enumerable.Cast InvalidCastException
Cast/Convert IEnumerable<T> to IEnumerable<U> ?क्यों नहीं <double>() IENumerable <int> पर काम नहीं करेगा?

मैं युगल की एक सरणी के लिए पूर्णांकों की एक सरणी परिवर्तित करने के लिए कोशिश कर रहा हूँ (ताकि मैं इसे एक समारोह है कि लेता है पारित कर सकते हैं युगल की एक सरणी)।

सबसे स्पष्ट समाधान (मेरे लिए, कम से कम) IENumerable के लिए कास्ट एक्सटेंशन फ़ंक्शन का उपयोग करना है, लेकिन यह मुझे एक अवैध कैस्ट अपवाद देता है, और मुझे समझ में नहीं आता है। मेरा कामकाज का उपयोग करना है इसके बजाय चयन करें, लेकिन मुझे लगता है कि कास्ट neater दिखता है।

क्या कोई मुझे बता सकता है कि कास्ट विधि क्यों काम नहीं कर रही है?

उम्मीद है कि कोड के नीचे मेरी समस्या दिखाता है:

namespace ConsoleApplication1 
{ 
    using System; 
    using System.Collections.Generic; 
    using System.Linq; 

    class Program 
    { 
     static void Main() 
     { 
      var intArray = new[] { 1, 2, 3, 4 }; 
      PrintEnumerable(intArray, "intArray: "); 

      var doubleArrayWorks = intArray.Select(x => (double)x).ToArray(); 
      PrintEnumerable(doubleArrayWorks, "doubleArrayWorks: "); 

      // Why does this fail?? 
      var doubleArrayDoesntWork = intArray.Cast<double>().ToArray(); 
      PrintEnumerable(doubleArrayDoesntWork, "doubleArrayDoesntWork: "); 

      // Pause 
      Console.ReadLine(); 
     } 

     private static void PrintEnumerable<T>(
      IEnumerable<T> toBePrinted, string msgPrefix) 
     { 
      Console.WriteLine(
       msgPrefix + string.Join(
        ",", toBePrinted.Select(x => x.ToString()).ToArray())); 
     } 
    } 

}

+0

ओउप्स ... मैंने पूछने से पहले पर्याप्त रूप से स्टैक ओवरफ़्लो की जांच नहीं की थी। मैंने पाया कि मेरा प्रश्न पहले से ही पूछा जा चुका है और उत्तर दिया गया है: http://stackoverflow.com/questions/1684448/enumerable-castt-extension-method-fails-to-cast-from-int-to-long- क्यों – dominic

उत्तर

2

सरणी वर्ग के Convertall विधि का उपयोग कर प्रयास करें। यह आपको रूपांतरण पर स्पष्ट नियंत्रण देता है।

var doubleArray = Array.ConvertAll<int, double>(intArray, num => (double)num); 

यह आपके द्वारा अनुभव की जा रही आंतरिक त्रुटि को छोड़ देता है।

अन्य विधियां आपको रूपांतरण प्रक्रिया पर भी स्पष्ट नियंत्रण देती हैं।

+1

वही है चयन का उपयोग करने के रूप में। – Dykam

9

समस्या इस तथ्य से आती है कि कास्ट ऑपरेटर (अधिभारित) संकलन समय पर हल हो जाते हैं। सोचने का प्रयास करें कि कैसे कास्ट लागू किया जाता है। मुझे यकीन है कोड इस तरह दिखता है:

public static IEnumerable<T> Cast<T>(this IEnumerable source) 
{ 
    foreach(object element in source) 
    { 
     yield return (T)(object)element; 
    } 
} 

सभी जानकारी संकलक है कि यह एक प्रकार टी करने के लिए एक वस्तु कास्ट करने के लिए की जरूरत है और वह के लिए यह डिफ़ॉल्ट विरासत कास्टिंग का प्रयोग करेंगे। कोई कस्टम अधिभारित ऑपरेटर का उपयोग नहीं किया जाएगा। और आपके उदाहरण में एक int एक डबल नहीं है इसलिए कलाकार विफल हो जाएगा।

चयन उदाहरण:

source.Select(a => (double)a)); 

काम करता है क्योंकि संकलक दोनों प्रकार जानता है और यह उचित अतिभारित ऑपरेटर कॉल करने में सक्षम है।

+0

यहां देखने के लिए मुख्य बात यह है कि टाइपकास्ट _syntax_ दोनों टाइपकास्ट _and_ रूपांतरण ऑपरेटरों के लिए उपयोग किया जाता है। संख्यात्मक प्रकारों के बीच रूपांतरण रूपांतरण ऑपरेटर होते हैं, नहीं। – Joey

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

  • कोई संबंधित समस्या नहीं^_^