Variance केवल एक सुरक्षित तरीके से समर्थित होगा - वास्तव में, उन क्षमताओं का उपयोग करके जो CLR में पहले से हैं। इसलिए उदाहरण मैं एक का उपयोग करने की कोशिश की पुस्तक में देता हूंList<Banana>
एक List<Fruit>
(या जो कुछ भी था) वह अभी भी काम नहीं करेगा - लेकिन कुछ अन्य परिदृश्य होंगे।
सबसे पहले, यह केवल इंटरफेस और प्रतिनिधियों के लिए समर्थित होगा।
दूसरे, यह इंटरफ़ेस के प्रतिनिधि की आवश्यकता है / प्रतिनिधि के रूप में प्रकार के मापदंडों को सजाने के in
लिए (विपरीत के लिए) या out
(सहसंयोजक के लिए)। सबसे स्पष्ट उदाहरण है IEnumerable<T>
जो केवल आपको कभी भी मानों को "बाहर" लेने देता है - यह आपको नए लोगों को जोड़ने की अनुमति नहीं देता है। वह बन जाएगा IEnumerable<out T>
। यह सभी प्रकार की सुरक्षा को नुकसान नहीं पहुंचाता है, लेकिन आपको वापस IEnumerable<string>
लौटने के लिए घोषित विधि से लौटने देता हैIEnumerable<object>
उदाहरण के लिए ।
इंटरफेस का उपयोग करने के लिए ठोस उदाहरण देना कठिन है, लेकिन एक प्रतिनिधि के साथ यह आसान है। विचार करें Action<T>
- कि बस एक विधि का प्रतिनिधित्व करता है जो एक T
पैरामीटर लेता है । यह अच्छा होगा कि मूल Action<object>
रूप से एक के रूप में उपयोग करने में सक्षम होने के लिए Action<string>
- कोई भी तरीका जो एक object
पैरामीटर लेता है वह ठीक होने वाला है जब इसके string
बजाय इसे प्रस्तुत किया जाता है। बेशक, सी # 2 में पहले से ही कुछ हद तक प्रतिनिधियों का सहसंयोजक और विरोधाभासी है, लेकिन एक प्रतिनिधि प्रकार से दूसरे में एक वास्तविक रूपांतरण के माध्यम से (एक नया उदाहरण बना) - उदाहरण के लिए P141-144 देखें। C # 4 इसे और अधिक सामान्य बना देगा, और (मेरा मानना है) रूपांतरण के लिए एक नया उदाहरण बनाने से बचना होगा। (इसके बजाय एक संदर्भ रूपांतरण होगा।)
आशा है कि यह इसे थोड़ा साफ करता है - कृपया मुझे बताएं कि क्या इसका कोई मतलब नहीं है!