2010-10-27 12 views
14

नीचे कोड में:प्रश्न

interface I1 { } 
class CI1: I1 { } 

List<CI1> listOfCI1 = new List<CI1>(); 

IEnumerable<I1> enumerableOfI1 = listOfCI1; //this works 

IList<I1> listofI1 = listOfCI1; //this does not 

मैं एक IEnumerable<I1> करने के लिए अपने "listOfCI1" आवंटित करने में सक्षम हूँ (सहप्रसरण के कारण)

लेकिन कारण है कि मैं करने के लिए इसे प्रदान करने में सक्षम नहीं कर रहा हूँ एक IList<I1>? उस मामले के लिए, मैं भी ऐसा नहीं कर सकते निम्नलिखित:

List<I1> listOfI12 = listOfCI1; 

सहप्रसरण मुझे एक आधार प्रकार के एक व्युत्पन्न प्रकार आवंटित करने के लिए अनुमति नहीं करना चाहिए?

उत्तर

24

बस डालें, IList<T> कॉन्वेंट नहीं है, जबकि IEnumerable<T> है। यहां क्यों है ...

मान लीजिए IList<T> कॉन्वर्सेंट था। नीचे दिया गया कोड स्पष्ट रूप से टाइप-सुरक्षित नहीं है ... लेकिन आप त्रुटि कहां चाहते हैं?

IList<Apple> apples = new List<Apple>(); 
IList<Fruit> fruitBasket = apples; 
fruitBasket.Add(new Banana()); // Aargh! Added a Banana to a bunch of Apples! 
Apple apple = apples[0]; // This should be okay, but wouldn't be 

बहुत विचरण पर विस्तार के के लिए, एरिक Lippert के blog post series उस पर देखते हैं, या एनडीसी से विचरण के बारे में मेरी बात का video देखते हैं।

असल में, विचरण ही कभी अनुमति दी है, जहां यह सुरक्षित होने की गारंटी है (और एक प्रतिनिधित्व के संरक्षण तरीका है, जिसके कारण आप IEnumerable<object> में IEnumerable<int> परिवर्तित नहीं कर सकते में - मुक्केबाजी रूपांतरण प्रतिनिधित्व की रक्षा नहीं करता है)।

+0

बीटीडब्ल्यू, यह बात बहुत अच्छी थी। –

+0

@ अरनिस: धन्यवाद - मैंने इसे खुद का आनंद लिया, भले ही मुझे होकी कोकी वीडियो दिखाया न जाए ... –

+2

जॉन, बीसीएल टीम ने भी जोड़ा (आईनेमेरेबल : आईनेमेरेबल), क्योंकि IENumerable आपको इसे सुरक्षित बनाने के लिए किसी नए सदस्य (यानी इसके अपरिवर्तनीय) को जोड़ने की अनुमति नहीं देता है। लेकिन दूसरी तरफ IList पर "आउट" नहीं जोड़ा गया क्योंकि यह उत्परिवर्तनीय है (अंतर्निहित सूची में एक अलग कार्यान्वयन जोड़ने के लिए संभव है?) –

3

सं

अन्यथा, आप तो एक सूची है कि केवल C1 रों को शामिल करना चाहिए करने के लिए I1 का एक अलग कार्यान्वयन जोड़ने में सक्षम होगा।

1

IList<T> इंटरफ़ेस कॉन्फ़िगर नहीं है।

5

तुलना करें घोषणाओं (MSDN)

public interface IEnumerable<out T> : IEnumerable 

public interface IList<T> : ICollection<T>, IEnumerable<T>, IEnumerable 

आप देखते हैं कि जादुई शब्द out? इसका मतलब है कि कॉन्वर्सिस चालू है।

+3

अधिक विशेष रूप से, इसका अर्थ यह है कि 'टी' * के लिए' IENumerable 'कॉन्वेंट * है। एक इंटरफेस कुछ प्रकार के पैरामीटर में भिन्न हो सकता है लेकिन दूसरों को नहीं। –

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