यह स्पष्ट है कि T[]
सरणी प्रकार covariant नहीं है क्योंकि T[]
के तत्वों को इंडेक्स द्वारा सेट किया जा सकता है।यह कैसे है कि [[] टी [] के लिए जाति योग्य है?
और फिर भी, एक U[]
एक T[]
को कोई शिकायत बिना संकलक से जब तक U
T
से निकला है के रूप में ढाला जा सकता है।
Man[] men = new[] { new Man("Aaron"), new Man("Billy"), new Man("Charlie") };
Person[] people = (Person[])men;
ऊपर कोड ऐसा लगता है कि
men
और
people
ही
Array
वस्तु के लिए एक संदर्भ पकड़ पा रहे हैं में
। men[0] = new Man("Aidan")
को सेट करने का प्रभाव people[0]
पर देखा जा सकता है। इसी तरह people[0] = new Woman("Debbie")
का प्रयास ArrayTypeMismatchException
रनटाइम * पर होता है।
क्या इसका मतलब यह है कि T[]
प्रकार वास्तव में प्रत्येक set
कॉल पर टाइपिंग जांच करता है? ऐसा लगता है कि अगर यह इस तरह से सरणी डालने की अनुमति है तो यह आवश्यक होना चाहिए।
मुझे लगता है कि मेरा प्रश्न है: यह कैसे संभव है? यह मुझे स्पष्ट है कि U[]
T[]
से प्राप्त नहीं होता है। यह अस्पष्ट है कि मैं कभी भी अपने स्वयं के प्रकार को परिभाषित कर सकता हूं जो इस तरह से काम करेगा: वास्तव में इनवेरिएंट लेकिन अधिनियम कॉन्वेंटेंट है।
* हालांकि सरणी विचरण जाहिरा तौर पर CLR ने अनुमति दी है, किसी भी भाषा सरणी प्रकार के बीच कास्टिंग नामंज़ूर कर सकता है। हालांकि, ऐसा लगता है कि इस व्यवहार VB.NET में समान होता है:
Dim men = New Man() { New Man("Aaron"), New Man("Billy"), New Man("Charlie") }
Dim people = CType(men, Person())
क्या आप इसे किसी विशेष भाषा के साथ टैग कर सकते हैं, हम में से उन लोगों के लिए जो आप नहीं जानते कि आप कौन सी बात कर रहे हैं? –
@ फिलिप: मैं * कर सकता था, लेकिन यह वीबीएनईटी और सी # के लिए समान रूप से लागू लगता है। यही कारण है कि मैं सिर्फ .NET टैग के साथ गया था। –
एक भाषा पूरी तरह से इसे अस्वीकार नहीं कर सकती है - भाषा एक्स में लिखी गई विधि भाषा वाई से एक कॉवररीएटेड सरणी प्राप्त कर सकती है। – SLaks