C# में कोवेरिएंस और कंट्रावेरिएंस जेनेरिक टाइप पैरामीटर्स के लिए अंतर्निहित (implicit) रूपांतरण सक्षम करते हैं, जिससे टाइप सेफ्टी बनी रहती है। ये एरे, डेलीगेट्स, और जेनेरिक इंटरफेस पर लागू होते हैं।
वर्ग पदानुक्रम
class One { }
class Two : One { }
class Three : Two { }
कोवेरिएंस (Covariance) - out कीवर्ड
एक बेस टाइप की अपेक्षा वाली जगह पर डेराइव्ड टाइप पास करना। "आउट" पोजीशन (रिटर्न टाइप) के लिए।
- एरे:
Two[] twoArr = new Three[10]; One[] oneArr = twoArr;(रनटाइम चेक के साथ) - डेलीगेट्स:
Func<Two> f2 = ...; Func<One> f1 = f2; - इंटरफेस:
IEnumerable<out T>-IEnumerable<Three>कोIEnumerable<One>असाइन कर सकते हैं।
कंट्रावेरिएंस (Contravariance) - in कीवर्ड
एक डेराइव्ड टाइप की अपेक्षा वाले पैरामीटर के लिए बेस टाइप पास करना। "इन" पोजीशन (पैरामीटर) के लिए।
- डेलीगेट्स:
Action<One> a1 = ...; Action<Two> a2 = a1; - इंटरफेस:
IComparer<in T>,Action<in T>।
मुख्य नियम
- केवल रेफरेंस टाइप्स के लिए (वैल्यू टाइप्स के लिए नहीं)।
- इंटरफेस/डेलीगेट परिभाषा में
out(कोवेरिएंट) याin(कंट्रावेरिएंट) मार्क होना चाहिए। - क्लासेस वेरिएंट नहीं होतीं।