2009-10-26 18 views
24

घोषणा परिप्रेक्ष्य निम्नलिखित के लिएफिक्स्ड आकार सूची में

IList<string> list= new string[3]; 
    list.Add("Apple"); 
    list.Add("Manago"); 
    list.Add("Grapes"); 

1) यह ठीक संकलित की अनुमति दी है, लेकिन क्रम मैं "Collection was of fixed size" त्रुटि हो रही है। संभोग, संग्रह आकार के अनुसार गतिशील रूप से उगाया जाता है, इस तरह की घोषणा शिकायतकर्ता द्वारा क्यों स्वीकार की जाती है?

2) अलग-अलग सूचियां क्या हैं जिन्हें मैं IList को सौंप सकता हूं? उदाहरण

IList<string> fruits=new List<string>(); 

यहाँ मैं IList सूची बताए कर रहा हूँ, क्या विभिन्न संग्रह कक्षाएं मैं IList को असाइन कर सकते हैं?

उत्तर

41

मूल समस्या है कि यहाँ System.ArrayIList<T> को लागू करने से प्रतिस्थापन सिद्धांत का उल्लंघन करता है। System.Array प्रकार का एक निश्चित आकार है जिसे बदला नहीं जा सकता है। IList<T> पर जोड़ें विधि अंतर्निहित संग्रह में एक नया तत्व जोड़ने और इसका आकार 1 से बढ़ाना है। System.Array के लिए यह संभव नहीं है और इसलिए यह फेंकता है।

System.Array वास्तव में यहां लागू करना चाहता है केवल पढ़ने की शैली IList<T> है। दुर्भाग्यवश ढांचे में ऐसा कोई प्रकार मौजूद नहीं है और इसलिए यह अगली सबसे अच्छी चीज लागू करता है: IList<T>

IList<T> पर किस प्रकार के असाइन करने योग्य हैं, इस सवाल के अनुसार, वास्तव में कुछ हैं: ReadOnlyCollection<T> और Collection<T>। यहां डालने के लिए सूची बहुत लंबी है। इसे देखने का सबसे अच्छा तरीका प्रतिबिंबक में IList<T> खोलना है और IList<T> के व्युत्पन्न प्रकारों को देखना है।

+0

शब्दकोश <टीके, टीवीएयू> आईसीओलेक्शन लागू करता है, न कि IList thecoop

+0

@thecoop, अच्छी पकड़, अद्यतन – JaredPar

6

जब आप सूची कॉल करते हैं। जोड़ें, आप किसी आइटम को अपने सरणी के अंत में डालने का प्रयास कर रहे हैं। Arrays एक निश्चित आकार संग्रह हैं ताकि आप एक जोड़ नहीं कर सकते हैं। इसके बजाय आप इंडेक्सर द्वारा एंट्री आवंटित करने के लिए करना होगा:

list[0] = "a"; 
list[1] = "b"; 
list[2] = "c"; 
2

@ जेक: वास्तव में एक स्ट्रिंग [] एक आईएलआईस्ट के लिए जाली योग्य है ... लेकिन आप इसे जोड़ नहीं सकते हैं।

आप सूची प्री-पॉप्युलेट चाहते हैं, तो आप सकता है की तरह कुछ का उपयोग करें:

IList<string> list= new string[3] { "Apple", "Mango", "Grapes" }; 

लेकिन तब यह एक IList बनाने की बात क्या है? आप अभी भी इसमें शामिल नहीं हो सके। यदि यह वास्तव में एक निश्चित आकार की सूची है, तो इसे एक स्ट्रिंग बनाएं []। अन्यथा, इसे एक सूची() बनाएं, जैसा कि जेक सुझाव देता है।

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