यह सी # की विशेष रूप से भ्रमित विशेषता है। यहाँ सौदा है।
इस चर्चा के दौरान हम मानते हैं कि एक सरणी का तत्व प्रकार संदर्भ प्रकार नहीं है, मान प्रकार नहीं है।
सी # असुरक्षित सरणी covariance का समर्थन करता है। इसका मतलब है कि अगर आप स्ट्रिंग की एक सरणी है, तो आप यह वस्तु की एक सरणी के लिए, परिवर्तित कर सकते हैं क्योंकि एक स्ट्रिंग एक वस्तु में बदला जा सकता:
string[] a1 = { "hello", "goodbye" };
object[] a2 = a1; // Legal
आप तो a2 से बाहर एक तत्व प्राप्त करने की कोशिश करते हैं, तो यह काम करता है:
object o3 = a2[0];
कि कानूनी है, क्योंकि a2[0]
वास्तव में a1[0]
है, जो एक स्ट्रिंग है, जो वस्तु के लिए परिवर्तनीय है।
हालांकि, अगर आप सरणी लिखने करने का प्रयास तो आप क्रम में एक त्रुटि मिल जाएगा:
a2[0] = new object();
इस क्रम में विफल रहता है, क्योंकि a2
वास्तव में है तार की एक सरणी और आप तारों की सरणी में एक गैर स्ट्रिंग नहीं डाल सकते हैं।
तो सी # पहले ही बहुत ही टूटा हुआ है; एक प्रोग्राम लिखना संभव है जो संकलित करता है और सामान्य दिखता है लेकिन अचानक रनटाइम पर एक प्रकार के अपवाद के साथ दुर्घटनाग्रस्त हो जाता है क्योंकि आपने ऑब्जेक्ट को उन ऑब्जेक्ट्स में डालने की कोशिश की जो वास्तव में ऑब्जेक्ट्स की सरणी नहीं हैं।
आप जिस सुविधा को चाहते हैं वह से भी अधिक टूटा हुआ है, और शुक्रिया का धन्यवाद सी # इसका समर्थन नहीं करता है। सुविधा आप चाहते है:
object[] a4 = { "Hello" };
string[] a5 = a4;
कि असुरक्षित सरणी contravariance होगा। यह इस तरह से बुरी तरह टूट जाता है:
a4[0] = new Customer(); // Perfectly legal
string s6 = a5[0];
और अब हम सिर्फ के प्रकार स्ट्रिंग एक चर में एक ग्राहक की नकल की।
आपको किसी भी तरह की सरणी या contravariance से बचना चाहिए; सरणी contravariance है, जैसा कि आपने पाया है, कानूनी नहीं है, और सरणी covariance आपके कार्यक्रम में कम समय बम बना रहा है जो अप्रत्याशित रूप से बंद हो जाता है। शुरू करने के लिए सही प्रकार के अपने सरणी बनाएं।
आप अपनी सरणी कास्टिंग कैसे कर रहे हैं? एक पूरे के रूप में? आपको व्यक्तिगत रूप से अपने सरणी के प्रत्येक तत्व को कास्ट करने की आवश्यकता है। – Msonic
हां, वह स्पष्ट रूप से इसे पूरी तरह से कास्टिंग कर रहा है। –
ऐरे-ऑफ-रेफरेंस भिन्नता दूसरी तरफ है; आप ** ऑब्जेक्ट [] 'के रूप में ** वास्तव में ** एक' स्ट्रिंग [] 'कुछ ऐसा कर सकते हैं, लेकिन दूसरी तरफ जाने के लिए यह वास्तव में' स्ट्रिंग [] ' –