दो प्रमुख अवधारणाएं भूमिका निभाती हैं: Type Conversions और Generic Interfaces Variance। जहां भिन्नता अग्रणी है।
केस 1:List<T>
में वर्ग परिभाषा, हम सामान्य पैरामीटर पर विचरण नहीं है। इसलिए हमारे पास List<object>
और List<string>
के बीच कोई संबंध परिभाषित नहीं है। वे invariant हैं। इसलिए दोनों निहित और स्पष्ट प्रकार के रूपांतरण संभव नहीं हैं।
केस 2:List<T>
औजार IEnumerable<out T>
जो covariant सामान्य प्रकार है, इसलिए List<string>
परोक्ष IEnumerable<object>
विवरण के लिए डाली जा सकता है:
क्यों विचरण List<T>
लिए अनुमति नहीं है, लेकिन IEnumerable<T>
के लिए अनुमति दी?
जेनरिक का बिंदु संकलन-समय प्रकार की सुरक्षा प्रदान करना है। क्योंकि List<T>
लिखने योग्य है और अगर वहाँ एक संकलन समय जांच नहीं था, हम निम्नलिखित लिख सकते हैं और एक रन-टाइम त्रुटि हो सकता है:
List<string> stringList = new List<string>();
stringList.Add("some string"); // we are safe
List<object> objectList = stringList;
objectList.Add((new Object()); // Aargh!
// we are trying to put an object to a list of strings!
List<T>
के लिए तो असुरक्षित विचरण।
लेकिन IEnumerable<out T>
केवल पढ़ने के लिए है। यह संदर्भित उदाहरण को संशोधित करने का एक तरीका प्रदान नहीं करता है।
IEnumerable<object> objectList = new List<string>();
// we can't add a string to the objectList,
// as `IEnumerable<out T>` is a read-only interface.
तो एक सुरक्षित भिन्नता संभव है।
कॉन्वर्सिस और contravariance को देखो। – HimBromBeere
http://stackoverflow.com/questions/16966961/cannot-convert-from-listderivedclass-to-listbaseclass या http://stackoverflow.com/questions/1817300/convert-listderivedclass-to-listbaseclass देखें। – wkl
यदि आप अभी भी एसए करना चाहते हैं। '