c# - Why won't Cast<double>() work on IEnumerable<int>? -


संभावित डुप्लिकेट:


मैं एक पूर्णांक संख्या को कनवर्ट करने की कोशिश कर रहा हूं जो कि युगल के सरणी में है (इसलिए मैं इसे एक फ़ंक्शन के पास कर सकता हूं जो डबल्स की एक सरणी लेता है)।

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

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

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

  नाम स्थान ConsoleApplication1 {सिस्टम का उपयोग कर ; System.Collections.Generic का उपयोग कर; System.Linq का उपयोग कर; कक्षा कार्यक्रम {स्थैतिक शून्य मुख्य () {var intArray = new [] {1, 2, 3, 4}; प्रिंटअन्यरेबल (इंटरेरे, "इंटरेरे:"); Var doubleArrayWorks = intArray.Select (x = & gt; (डबल) x) .ओएरे (); मुद्रितअन्य (डबलअरेरे वर्क्स, "डबलअरेरे वर्क्सः"); // यह क्यों असफल है ?? Var डबल अर्रेडोसेंट वर्क्स = इंटरेरे। कैस्ट & lt; डबल & gt; ()। ToArray (); प्रिंटइंटरमेरेबल (डबलअरेरे डॉट्सवर्क वर्क, "डबलअरेरे डॉट्सवर्क वर्क:"); // रोकें कंसोल.रेडलाइन (); } निजी स्थिर शून्य PrintEnumerable & LT; टी & gt; (IEnumerable & LT; टी & gt; toBePrinted, स्ट्रिंग msgPrefix) {Console.WriteLine (msgPrefix + string.Join ( ",", toBePrinted.Select (एक्स = & gt;। X.ToString ()) toArray ( ))); }}  

}

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

  सार्वजनिक स्थिर IEnumerable & lt; T & gt; कास्ट & lt; T & gt; (यह IEnumerable स्रोत) {foreach (स्रोत में वस्तु तत्व) {उपज रिटर्न (टी) (ऑब्जेक्ट) तत्व; }}  

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

चुनें उदाहरण:

  source.Select (a = & gt; (डबल) a) );  

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


Comments

Popular posts from this blog

c# - How to capture HTTP packet with SharpPcap -

php - Multiple Select with Explode: only returns the word "Array" -

php - jQuery AJAX Post not working -