सूची <T> एक वर्ग है और दोनों ICollection <T> और IEnumerable <T> इंटरफेस को लागू करता है। इसके अलावा, ICollection <T> IEnumerable <T> इंटरफ़ेस का विस्तार करता है। वे विनिमेय नहीं हैं, कम से कम सभी दृष्टिकोणों से नहीं।
यदि आपके पास एक सूची <T> है, तो आपको गारंटी दी जाती है कि यह ऑब्जेक्ट ICOLlection <T> और IEnumerable <T> इंटरफ़ेस द्वारा कार्यान्वित करने के लिए आवश्यक विधियों और गुणों को लागू करता है। संकलक यह जानता है और आपको उन्हें "डाउन" या तो एक ICollection <T> या एक IEnumerable <T> अंतर्निहित रूप से डालने की अनुमति है। हालाँकि, यदि आपके पास एक ICollection <T> है, तो आपको अपने कोड में पहले स्पष्ट रूप से जांचना होगा कि क्या यह सूची <T> है या कुछ और, शायद एक शब्दकोश <T> (जहाँ T यह एक KeyValuePair है ) आपको इसे डालने से पहले। मंशा।
आप जानते हैं कि ICollection IEnumerable का विस्तार करता है, इसलिए आप इसे IEnumerable में डाल सकते हैं। लेकिन अगर आपके पास केवल IEnumerable है, तो फिर से आपको गारंटी नहीं दी जाती है कि यह एक सूची है। यह हो सकता है, लेकिन यह कुछ और हो सकता है। यदि आप उदाहरण के लिए <T> को एक शब्दकोश <T> में डालने का प्रयास करते हैं, तो आपको एक अमान्य कास्ट अपवाद की अपेक्षा करनी चाहिए।
इसलिए वे "विनिमेय" नहीं हैं।
इसके अलावा, बहुत सारे सामान्य इंटरफ़ेस हैं, यह देखें कि आप System.Collections.Generic नाम में क्या पा सकते हैं ।
संपादित करें: आपकी टिप्पणी के बारे में, यदि आप सूची <T> का उपयोग करते हैं या इसे लागू करने वाले इंटरफ़ेस में से कोई एक प्रदर्शन जुर्माना है। फिर भी आपको एक नई वस्तु बनाने की आवश्यकता होगी, निम्नलिखित कोड देखें:
List<T> list = new List<T>();
ICollection<T> myColl = list;
IEnumerable<T> myEnum = list;
सूची , myColl , और myEnum सभी एक ही वस्तु को इंगित करते हैं। चाहे आप इसे एक सूची के रूप में घोषित करें या एक ICollection या IEnumerable मैं अभी भी सूची बनाने के लिए कार्यक्रम की आवश्यकता कर रहा हूं। मैं यह लिख सकता था:
ICollection<T> myColl = new List<T>();
myColl , रनटाइम पर अभी भी एक सूची है।
हालांकि , यह एक सबसे महत्वपूर्ण बिंदु है ... युग्मन को कम करने और बनाए रखने की क्षमता को बढ़ाने के लिए आपको हमेशा अपने चर और विधि मापदंडों की घोषणा करना चाहिए ताकि आपके लिए सबसे कम संभव भाजक का उपयोग किया जा सके, चाहे वह एक इंटरफ़ेस या एक सार या ठोस वर्ग हो।
कल्पना करें कि "परफॉर्मेपरेशन" विधि की एकमात्र जरूरत तत्वों की गणना करना है, कुछ काम और निकास करना है, उस स्थिति में आपको सूची <T> में उपलब्ध सौ अधिक विधियों की आवश्यकता नहीं है, आपको केवल IEnumerer <T में उपलब्ध है। >, इसलिए निम्नलिखित आवेदन करना चाहिए:
public void PerformOperation(IEnumerable<T> myEnumeration) { ... }
ऐसा करने से, आप और अन्य डेवलपर्स जानते हैं कि IEnumerable <T> इंटरफ़ेस को लागू करने वाले किसी भी वर्ग की कोई भी वस्तु इस पद्धति को दी जा सकती है। यह एक सूची, एक शब्दकोश या एक कस्टम संग्रह वर्ग हो सकता है जो किसी अन्य डेवलपर ने लिखा हो।
यदि इसके विपरीत आप स्पष्ट रूप से एक ठोस सूची की आवश्यकता है <T> (और यद्यपि यह वास्तविक जीवन में शायद ही कभी ऐसा होता है, तो भी हो सकता है), आप और अन्य डेवलपर्स जानते हैं कि या तो यह एक सूची होनी चाहिए या कोई अन्य ठोस वर्ग विरासत में मिला है सूची से।