जेनरिक में out
कीवर्ड निरूपित करने के लिए है कि इंटरफ़ेस में प्रकार टी covariant है प्रयोग किया जाता है। विवरण के लिए Covariance and contravariance देखें।
क्लासिक उदाहरण IEnumerable<out T>
है। चूंकि IEnumerable<out T>
covariant है, तो आप निम्न कार्य करने की अनुमति हो:
IEnumerable<string> strings = new List<string>();
IEnumerable<object> objects = strings;
अगर यह covariant नहीं कर रहा था ऊपर दूसरी पंक्ति विफल हो जाएगा, यहां तक कि तार्किक हालांकि यह काम करना चाहिए, के बाद से स्ट्रिंग वस्तु से निकला है। variance in generic interfaces से पहले C# और VB.NET में जोड़ा गया था (वीईएस 2010 के साथ .NET 4 में), यह एक संकलित समय त्रुटि थी।
.NET 4, IEnumerable<T>
के बाद कॉन्वेंट चिह्नित किया गया था, और IEnumerable<out T>
बन गया। चूंकि IEnumerable<out T>
केवल इसके भीतर के तत्वों का उपयोग करता है, और उन्हें कभी भी जोड़ता/बदलता नहीं है, यह वस्तुओं के एक गणना संग्रह के रूप में तारों के एक गणना संग्रह का इलाज करने के लिए सुरक्षित है, जिसका अर्थ यह है कि यह कॉन्वर्स है।
यह IList<T>
जैसे किसी प्रकार के साथ काम नहीं करेगा, क्योंकि IList<T>
में Add
विधि है। मान लीजिए यह अनुमति दी जाएगी:
IList<string> strings = new List<string>();
IList<object> objects = strings; // NOTE: Fails at compile time
फिर आप कह सकते हैं:
objects.Add(new Image()); // This should work, since IList<object> should let us add **any** object
यह, ज़ाहिर है, विफल हो जाएगा - तो IList<T>
चिह्नित नहीं किया जा सकता covariant।
in
के लिए एक विकल्प भी है, जिसका उपयोग तुलना इंटरफेस जैसी चीजों द्वारा किया जाता है।IComparer<in T>
, उदाहरण के लिए, विपरीत तरीके से काम करता है।का उप-वर्ग है, क्योंकि IComparer<in T>
इंटरफ़ेस contravariant है, तो आप को सीधे IComparer<Bar>
के रूप में एक ठोस IComparer<Foo>
का उपयोग कर सकते हैं।
अच्छा उदाहरण IObservable होगा और IObserver , परिभाषित mscorlib में सिस्टम एनएस में। सार्वजनिक इंटरफ़ेस IObservable , और सार्वजनिक इंटरफ़ेस IObserver । इसी तरह, आईनेमेरेटर , आईनेमेरेबल –
VivekDev