तो आप एक ही प्रकार के पैरामीटर के लिए दोनों का समर्थन क्यों नहीं कर सकते?
ध्यान रखें कि एक इंटरफेस सिर्फ एक प्रकार पैरामीटर में covariant जा सकता है अगर उस प्रकार पैरामीटर उत्पादन के लिए सुरक्षित है और एक इंटरफेस सिर्फ एक प्रकार पैरामीटर में contravariant जा सकता है अगर उस प्रकार पैरामीटर इनपुट-सुरक्षित है रखें।
वाक्यविन्यास out T
कहता है कि T
एक कॉन्वेंट प्रकार प्रकार पैरामीटर है।
वाक्यविन्यास in T
कहता है कि T
एक contravariant प्रकार पैरामीटर है।
T
एक कॉन्वेंट प्रकार प्रकार पैरामीटर है, यह परिभाषा इनपुट-असुरक्षित है।
T
एक contravariant प्रकार पैरामीटर है, यह परिभाषा आउटपुट-असुरक्षित है।
इसलिए, T
इनपुट-असुरक्षित और आउटपुट-असुरक्षित है।
परिणामस्वरूप, T
इनपुट स्थिति में निषिद्ध है, और T
आउटपुट स्थिति में निषिद्ध है।
इसलिए, T
इनपुट स्थिति में और इंटरफ़ेस द्वारा निर्दिष्ट किसी भी तरीके पर किसी भी आउटपुट स्थिति में प्रकट नहीं हो सकता है।
परिणामस्वरूप, T
इंटरफ़ेस पर बिल्कुल उपयोग नहीं किया जा सकता है, और एक प्रकार पैरामीटर के रूप में व्यर्थ है।
IFoo<Cat> cat = (IFoo<Animal>)new Foo<Dog>();
(आप को पढ़ने के लिए की जरूरत है: नतीजतन, भाषा डिजाइनरों भी इस तरह के एक बेकार प्रकार दोनों covariant और इंटरफेस पर contravariant बदसूरत
interface IFoo<in and out T> { }
Foo<T> : IFoo<T> { }
और फिर से बचने के लिए के रूप में चिह्नित सहित करने से रोक इनपुट-सुरक्षित और आउटपुट-सुरक्षित पर, भाषा विनिर्देश के 13.1.3.1 देखें।)
जेम्स, आप आज भिन्नता में रूचि रखते हैं। आप इस फीचर को डिज़ाइन करने के तरीके के बारे में लेखों और वीडियो की मेरी विशाल श्रृंखला को देखना चाहेंगे। वे यहां हैं: http://blogs.msdn.com/b/ericlippert/archive/tags/covariance+and+contravariance/default.aspx, नीचे से शुरू करें। –