अधिक जानकारी here मिल सकती है।
out
प्रकार पैरामीटर covariant बनाता है। यही है, आप या तो प्रकार या किसी व्युत्पन्न प्रकार का उपयोग कर सकते हैं। ध्यान दें कि out
जेनरिक के साथ ही इस तरह काम करता है, विधि हस्ताक्षर में उपयोग किए जाने पर इसका एक अलग अर्थ होता है (हालांकि आप शायद पहले ही उसे जानते थे)। के रूप में String
Object
से निकला
// Covariant interface.
interface ICovariant<out R> { }
// Extending covariant interface.
interface IExtCovariant<out R> : ICovariant<R> { }
// Implementing covariant interface.
class Sample<R> : ICovariant<R> { }
class Program
{
static void Test()
{
ICovariant<Object> iobj = new Sample<Object>();
ICovariant<String> istr = new Sample<String>();
// You can assign istr to iobj because
// the ICovariant interface is covariant.
iobj = istr;
}
}
आप देख सकते हैं, इंटरफ़ेस हस्ताक्षर में out
, आप एक ICovariant<Object>
चर के लिए एक ICovariant<String>
आवंटित करने के लिए अनुमति देता है:
यहाँ उदाहरण referenced page से लिया है। out
कीवर्ड के बिना, आप ऐसा करने में असमर्थ होंगे, क्योंकि प्रकार अलग होंगे।
आप कोविरिएन्स (और संबंधित contravariance) here के बारे में अधिक पढ़ सकते हैं।
अन्य उत्तर के रूप में बताया है, IEnumerable
केवल कोड जैसे लिखने के लिए कोशिश कर रहा है नेट 4 में covariant किया गया था:
IEnumerable<Object> strings = new List<string>();
में पिछले संस्करणों में नेट 4 और बाद के संस्करणों, लेकिन नहीं संकलित कर देगा ।
क्योंकि इंटरफ़ेस covariant है – Jodrell
नज़र यहाँ http://stackoverflow.com/questions/6732299/why-was-ienumerablet-made-covariant-in-c-sharp-4 – Likurg
[सहप्रसरण और contravariance] (http://msdn.microsoft.com/en-us/library/ee207183) – jrummell