=============
अद्यतन: मैंने इस उत्तर को इस ब्लॉग प्रविष्टि के आधार के रूप में उपयोग किया है:
रेफरी और आउट पैरामीटर प्रकार भिन्नता की अनुमति क्यों नहीं देते हैं?
इस मुद्दे पर अधिक टिप्पणी के लिए ब्लॉग पेज देखें। महान प्रश्न के लिए धन्यवाद।
=============
मान लीजिए कि आप श्रेणियां होती हैं लगता है चलो 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
लिखना है ।n
n
घटनाओं के इस क्रम की अनुमति देता है:
- एक
x
प्रकार का क्षेत्र घोषित करें Animal
।
- के पैरामीटर के
x
रूप में पास out
करें N
।
N
एक लिखता है Tiger
में n
है, जिसके लिए एक उपनाम है x
।
- एक और धागा पर, किसी एक लिखता है
Turtle
में x
।
N
की सामग्री को पढ़ने का प्रयास करता है n
, और Turtle
यह सोचता है कि यह एक परिवर्तनशील प्रकार है Mammal
।
स्पष्ट रूप से हम इसे अवैध बनाना चाहते हैं।
निष्कर्ष 4 : out
मापदंडों को "बड़ा" नहीं बनाया जा सकता है।
अंतिम निष्कर्ष : न तो ref
और न ही out
पैरामीटर उनके प्रकार भिन्न हो सकते हैं। अन्यथा करने के लिए सत्यापन प्रकार की सुरक्षा को तोड़ना है।
यदि बुनियादी प्रकार के सिद्धांत में ये मुद्दे आपकी रुचि रखते हैं, तो मेरी श्रृंखला को पढ़ने पर विचार करें कि C # 4.0 में covariance और contravariance कैसे काम करते हैं ।