अंतिम पंक्ति की अनुमति क्यों नहीं है?
क्योंकि डबल एक मान प्रकार है और ऑब्जेक्ट एक संदर्भ प्रकार है; कॉन्वर्सिस केवल तभी काम करता है जब दोनों प्रकार संदर्भ प्रकार हैं।
ऐसा इसलिए है क्योंकि डबल एक मान प्रकार है जो ऑब्जेक्ट से प्राप्त नहीं होता है, इसलिए कॉन्वर्सिस काम नहीं करता है?
नहीं। वस्तु वस्तु से प्राप्त होती है। ऑब्जेक्ट से प्राप्त सभी मान प्रकार।
अब सवाल आपसे पूछा जाना चाहिए था:
क्यों सहप्रसरण IEnumerable<object>
को IEnumerable<double>
कन्वर्ट करने के लिए काम नहीं करता है?
क्योंकि मुक्केबाजी कौन करता है? डबल से ऑब्जेक्ट में रूपांतरण बॉक्स डबल होना चाहिए। मान लीजिए कि आपके पास IEnumerator<object>.Current
पर कॉल है जो IEnumerator<double>.Current
के कार्यान्वयन के लिए "वास्तव में" एक कॉल है। कॉलर किसी ऑब्जेक्ट को वापस आने की अपेक्षा करता है। कैली एक डबल देता है। कोडिंग कहां है जो मुक्केबाजी निर्देश करता है जो डबल बॉक्स को IEnumerator<double>.Current
द्वारा बॉक्स किए गए डबल में लौटाता है?
यह कहीं भी है, और यही कारण है कि यह रूपांतरण अवैध है। Current
पर कॉल मूल्यांकन स्टैक पर आठ-बाइट डबल डालने जा रहा है, और उपभोक्ता मूल्यांकन स्टैक पर एक बॉक्स किए गए डबल के चार-बाइट संदर्भ की उम्मीद कर रहा है, और इसलिए उपभोक्ता क्रैश होने जा रहा है और बहुत मर जाएगा एक misaligned ढेर और अमान्य स्मृति के संदर्भ के साथ।
आप कोड के बक्से को अंजाम कि तो यह कुछ बिंदु पर लिखा हो गया है, और आप व्यक्ति ने इसे लिखने के लिए हो जाता है कर रहे हैं चाहते हैं।
IEnumerable<object> objects2 = doubleenumerable.Cast<object>();
अब आप एक सहायक विधि है कि मुक्केबाजी अनुदेश कि एक आठ बाइट के लिए एक संदर्भ के लिए डबल से डबल धर्मान्तरित होता है कहते हैं: सबसे आसान तरीका है Cast<T>
विस्तार विधि का उपयोग करने के लिए है।
अद्यतन: एक टिप्पणीकर्ता नोट करता है कि मैंने इस सवाल का आग्रह किया है - यानी, मैंने एक तंत्र के अस्तित्व को पूर्ववत करके एक प्रश्न का उत्तर दिया है जो मूल प्रश्न के समाधान के रूप में हर समस्या को हल करता है। Cast<T>
के कार्यान्वयन को जानने के लिए समस्या का समाधान कैसे किया जाता है या नहीं?
यह इस स्केच की तरह काम करता है। ध्यान दें कि पैरामीटर प्रकार नहीं सामान्य हैं:
public static IEnumerable<T> Cast<T>(this IEnumerable sequence)
{
if (sequence == null) throw ...
if (sequence is IEnumerable<T>)
return sequence as IEnumerable<T>;
return ReallyCast<T>(sequence);
}
private static IEnumerable<T> ReallyCast<T>(IEnumerable sequence)
{
foreach(object item in sequence)
yield return (T)item;
}
निर्धारित करता है कि टी करने के लिए वस्तु से डाली एक unboxing रूपांतरण है या एक संदर्भ रूपांतरण क्रम के लिए स्थगित किया जाता है के लिए जिम्मेदारी। जिटर जानता है कि टी संदर्भ प्रकार या मूल्य प्रकार है या नहीं। 99% समय निश्चित रूप से एक संदर्भ प्रकार होगा।
संभावित डुप्लिकेट [क्यों covariance और contravariance मूल्य प्रकार का समर्थन नहीं करते हैं] (http://stackoverflow.com/questions/12454794/why-covariance-and-contravariance-do-not-support-value-type) – nawfal