2009-05-31 19 views
6

IEnumerable<T>, IComparable<T> और कुछ और प्रकार टाइप-वेरिएंट में भिन्नता टाइप करें। IList<T>, ICollection<T> और कई अन्य नहीं हैं। क्यूं कर?.NET Framework 4.0

उत्तर

11

.NET Framework 4.0 सुरक्षित सह/अनुबंध-भिन्नता प्रस्तुत करता है। जबकि IEnumerable<T> उत्पादन पदों में Tकेवल है और IComparable<T>Tकेवल इनपुट की स्थिति में है IList<T> और ICollection<T>T दोनों में इनपुट और आउटपुट स्थिति है।

मान लें IList<T> समर्थित प्रकार विचरण: "। सी # का भविष्य"

static void FailingMethod(IList<object> list) { 
    list[0] = 5; 
} 

static void Test() { 
    var a = new List<string>(); 
    a[0] = "hello"; 
    FailingMethod(a); // if it was variant, this method call would be unsafe 
} 
+0

धन्यवाद! ऐसा लगता है कि इंडेक्सर्स का उपयोग किसी वर्ग को गैर-संस्करण बनाता है। लेकिन आईसीओलेक्शन <> केवल इनपुट पैरामीटर में टी है। – UserControl

+0

नहीं, यह सामान्य रूप से सूचकांक से संबंधित नहीं है। यह किसी भी अन्य विधि या संपत्ति की तरह, पैरामीटर और सूचकांक के वापसी प्रकार (और प्राप्त/सेट एक्सेसर्स का अस्तित्व) पर निर्भर करता है। आपके पास एक इंडेक्सर हो सकता है जैसे: टी यह [int अनुक्रमणिका] {get {return x [index] प्राप्त करें; }} और एक सेट एक्सेसर के बिना, यह संस्करण हो सकता है। –

1

ऐन्डर्स Hejlseberg एक संक्षिप्त है, लेकिन चर्चा है कि उनकी बात में सह/contravariance का वर्णन करता है, रोशन कॉन्वर्सिस और contravariance पर उनकी चर्चा प्रस्तुति में 50 मिनट और 17 सेकंड से शुरू होता है।

http://channel9.msdn.com/pdc2008/TL16/

संबंधित मुद्दे