=============
अद्यतन:
Why do ref and out parameters not allow type variation?
अधिक के लिए ब्लॉग पेज देखें: मैं इस ब्लॉग प्रविष्टि के लिए आधार के रूप में इस उत्तर के लिए इस्तेमाल किया इस मुद्दे पर टिप्पणी। महान सवाल के लिए धन्यवाद।
=============
के आप कक्षाएं Animal
, Mammal
, Reptile
, Giraffe
, Turtle
और Tiger
, स्पष्ट उपवर्गीकरण रिश्तों के साथ मान लीजिए करते हैं।
अब मान लीजिए कि आप एक विधि void M(ref Mammal m)
है। M
दोनों m
पढ़ और लिख सकते हैं।
आप M
के प्रकार Animal
के एक चर पारित कर सकते हैं?
नहीं। यही कारण है कि चर एक Turtle
हो सकता है, लेकिन M
समझेंगे कि यह केवल स्तनधारी हैं। Turtle
Mammal
नहीं है।
निष्कर्ष 1: ref
पैरामीटर "बड़ा" नहीं किया जा सकता। (स्तनधारियों की तुलना में अधिक जानवरों रहे हैं, तो चर "बड़ा" क्योंकि यह अधिक चीजों को शामिल कर सकते हो रही है।)
आप M
के प्रकार Giraffe
के एक चर पारित कर सकते हैं?
सं M
m
को लिख सकते हैं, और M
एक Tiger
m
में लिखने के लिए चाहते हो सकता है। अब आप एक चर प्रकार Giraffe
की वास्तव में है जो एक Tiger
रख दिया है।
निष्कर्ष 2: ref
पैरामीटर "छोटे" नहीं किए जा सकते हैं।
अब N(out Mammal n)
पर विचार करें।
क्या आप Giraffe
से N
के प्रकार का एक चर पास कर सकते हैं?
सं N
n
को लिख सकते हैं, और N
एक Tiger
लिखने के लिए चाहते हो सकता है।
निष्कर्ष 3: out
पैरामीटर "छोटे" नहीं किए जा सकते हैं।
आप N
के प्रकार Animal
के एक चर पारित कर सकते हैं?
हम्म।
अच्छा, क्यों नहीं? N
n
से पढ़ नहीं सकता है, यह केवल इसे लिख सकता है, है ना? आप Tiger
टाइप Animal
के चर के लिए लिखते हैं और आप सब ठीक हैं, है ना?
गलत। नियम "N
" n
पर लिख सकता है "।
नियमों संक्षेप में कर रहे हैं,:
1) N
सामान्य रूप से n
N
से पहले रिटर्न पर लिखने के लिए नहीं है। (यदि N
फेंकता है, सभी दांव बंद कर रहे हैं।)
2) N
पहले यह n
से कुछ पढ़ता n
के लिए कुछ लिखने के लिए है।
घटनाओं के इस क्रम परमिट कि:
- प्रकार
Animal
के एक क्षेत्र x
घोषित।
x
out
पैरामीटर N
पर पैरामीटर के रूप में x
पास करें।
N
Tiger
n
में लिखता है, जो x
के लिए उपनाम है।
- किसी अन्य धागे पर, कोई
Turtle
x
में लिखता है।
N
n
की सामग्री को पढ़ने का प्रयास करता है, और यह Turtle
को Mammal
प्रकार का एक चर है।
स्पष्ट रूप से हम इसे अवैध बनाना चाहते हैं।
निष्कर्ष 4: out
पैरामीटर "बड़ा" नहीं बनाया जा सकता है।
अंतिम निष्कर्ष: न तो ref
है और न ही out
मापदंडों उनके प्रकार भिन्न हो सकते हैं। अन्यथा करने के लिए सत्यापन योग्य प्रकार की सुरक्षा तोड़ना है।
यदि मूलभूत सिद्धांत सिद्धांत में इन मुद्दों में आपकी रुचि है, तो my series on how covariance and contravariance work in C# 4.0 पढ़ने पर विचार करें।
+1। वास्तविक विश्व स्तर के उदाहरणों का उपयोग करके महान स्पष्टीकरण जो स्पष्ट रूप से मुद्दों का प्रदर्शन करते हैं (यानी - ए, बी और सी के साथ समझाते हुए यह प्रदर्शित करना कठिन होता है कि यह क्यों काम नहीं करता है)। –
मुझे इस विचार प्रक्रिया को पढ़ने में नम्र महसूस होता है। मुझे लगता है कि मैं किताबों पर बेहतर वापस आ जाता हूं! –
इस मामले में, हम वास्तव में सार वर्ग चर का उपयोग तर्क के रूप में नहीं कर सकते हैं और इसके व्युत्पन्न क्लास ऑब्जेक्ट पर पास कर सकते हैं !! –