=============
अद्यतन: मैंने इस उत्तर को इस ब्लॉग प्रविष्टि के आधार के रूप में उपयोग किया है:
रेफरी और आउट पैरामीटर प्रकार भिन्नता की अनुमति क्यों नहीं देते हैं?
इस मुद्दे पर अधिक टिप्पणी के लिए ब्लॉग पेज देखें। महान प्रश्न के लिए धन्यवाद।
=============
मान लीजिए कि आप श्रेणियां होती हैं लगता है चलो Animal, Mammal, Reptile, Giraffe, Turtleऔर Tiger, स्पष्ट उपवर्गीकरण रिश्तों के साथ।
अब मान लीजिए आपके पास एक तरीका है void M(ref Mammal m)। Mदोनों पढ़ और लिख सकते हैं m।
क्या आप प्रकार Animalका एक चर पास कर सकते हैं M?
नहीं। उस चर में एक हो सकता है Turtle, लेकिन Mयह मान लेगा कि इसमें केवल स्तनधारी शामिल हैं। ए Turtleनहीं है Mammal।
निष्कर्ष 1 : refमापदंडों को "बड़ा" नहीं बनाया जा सकता है। (स्तनधारियों की तुलना में अधिक जानवर हैं, इसलिए चर "बड़ा" हो रहा है क्योंकि इसमें अधिक चीजें हो सकती हैं।)
क्या आप प्रकार Giraffeका एक चर पास कर सकते हैं M?
सं Mको लिख सकते हैं m, और Mएक लिखने के लिए चाहते हो सकता है Tigerमें m। अब आपने Tigerएक वेरिएबल में डाल दिया है जो वास्तव में टाइप का है Giraffe।
निष्कर्ष 2 : refपैरामीटर को "छोटा" नहीं बनाया जा सकता है।
अब विचार करें N(out Mammal n)।
क्या आप प्रकार Giraffeका एक चर पास कर सकते हैं N?
नहीं Nलिख सकते हैं n, और Nएक लिखना चाहते हो सकता है Tiger।
निष्कर्ष 3 : outपैरामीटर को "छोटा" नहीं बनाया जा सकता है।
क्या आप प्रकार Animalका एक चर पास कर सकते हैं N?
हम्म।
जरूर क्यों नहीं? Nसे नहीं पढ़ा जा सकता है n, यह केवल इसे लिख सकता है, है ना? आप एक Tigerप्रकार के चर के लिए लिखते हैं Animalऔर आप सभी सेट कर रहे हैं, है ना?
गलत। नियम " Nकेवल लिख सकता है n" नहीं है।
नियम हैं, संक्षेप में:
1) सामान्य रूप से रिटर्न Nसे nपहले लिखना है N। (यदि Nफेंकता है, तो सभी दांव बंद हैं।)
2) इससे पहले कि वह कुछ पढ़ता है कुछ Nलिखना है ।nn
घटनाओं के इस क्रम की अनुमति देता है:
- एक
xप्रकार का क्षेत्र घोषित करें Animal।
- के पैरामीटर के
xरूप में पास outकरें N।
Nएक लिखता है Tigerमें nहै, जिसके लिए एक उपनाम है x।
- एक और धागा पर, किसी एक लिखता है
Turtleमें x।
Nकी सामग्री को पढ़ने का प्रयास करता है n, और Turtleयह सोचता है कि यह एक परिवर्तनशील प्रकार है Mammal।
स्पष्ट रूप से हम इसे अवैध बनाना चाहते हैं।
निष्कर्ष 4 : outमापदंडों को "बड़ा" नहीं बनाया जा सकता है।
अंतिम निष्कर्ष : न तो refऔर न ही outपैरामीटर उनके प्रकार भिन्न हो सकते हैं। अन्यथा करने के लिए सत्यापन प्रकार की सुरक्षा को तोड़ना है।
यदि बुनियादी प्रकार के सिद्धांत में ये मुद्दे आपकी रुचि रखते हैं, तो मेरी श्रृंखला को पढ़ने पर विचार करें कि C # 4.0 में covariance और contravariance कैसे काम करते हैं ।