2010-06-05 6 views
8

के बारे में त्रुटि संदेश मुझे यह त्रुटि संदेश मिलता है और मैं यह नहीं समझ सकता कि क्यों!IEnumerable.GetEnumerator()

Error 1 'Exo5Chap12.ShortCollection<T>' does not implement interface member 
'System.Collections.IEnumerable.GetEnumerator()'. 
'Exo5Chap12.ShortCollection<T>.GetEnumerator()' cannot implement 
'System.Collections.IEnumerable.GetEnumerator()' because it does not have the matching 
return type of 'System.Collections.IEnumerator'.  
E:\MyFolders\Dev\c#\Chapter12\Exo5Chap12\Exo5Chap12\exo5.cs 9 18 Exo5Chap12 

GetEnumerator() के कार्यान्वयन के साथ कोड यहां दिया गया है। क्या गलत है?

public class ShortCollection<T> : IList<T> 
{ 
    protected Collection<T> innerCollection; 
    protected int maxSize = 10; 
    public IEnumerator<T> GetEnumerator() 
    { 
     return (innerCollection as IEnumerator<T>).GetEnumerator(); 
    } 
} 
+0

केवल IENumerable और IEnumerable कार्यान्वयन दोनों के लिए आंतरिक कोलेक्शन ऑब्जेक्ट नहीं डालें। नीचे दिए गए उत्तर में मेरा पूरा कोड देखें ... – code4life

+1

मुझे पता है कि त्रुटि संदेश आपको * बिल्कुल * क्या गलत कह रहा है: कि आईनेमरेबल लागू नहीं किया गया है, इसे लागू करने की आवश्यकता है, और यह एकमात्र तरीका है जो इसे लागू कर सकता है गलत रिटर्न प्रकार है। इससे पहले से ही एक परिष्कृत त्रुटि विश्लेषण हुआ और फिर भी यह आपके लिए समस्या का निदान करने की अनुमति देने के लिए पर्याप्त नहीं था। क्या एक अलग त्रुटि संदेश अधिक उपयोगी होगा? मदद के बिना समस्या का निदान करने के लिए आपको किस प्रकार का त्रुटि संदेश सक्षम होगा? –

+0

मैं एक नौसिखिया हूं और Wrox (शुरुआती) दृश्य सी # पुस्तक पढ़ रहा हूँ। मुझे नहीं पता था कि मुझे IENumerable और IENumerable दोनों को कार्यान्वित करना था, क्योंकि पुस्तक में इसका भी उल्लेख नहीं किया गया है। इसके अलावा वह कोड अभ्यास का उत्तर था (यह सोचकर कि क्या उन्होंने प्रिंटिंग से पहले कोड की जांच की थी)। मैंने msdn वेबसाइट और wrox फ़ोरम पर एक नज़र डाली थी लेकिन वे इसका भी उल्लेख नहीं करते हैं। मुझे कहना होगा कि मेरे लिए सीखने के लिए आईनेमेरेबल काफी कठिन है। लेकिन अब जब मैं फिर से त्रुटि पढ़ता हूं तो मैं सहमत हूं कि समझ में आता है। –

उत्तर

4

IEnumerable और IEnumerable<T> अलग इंटरफेस हैं और अपने कोड दोनों कार्यान्वित करना होगा। आपका कोड केवल IEnumerable<T> के GetEnumerator() को लागू करता है, लेकिन IEnumerable का GetEnumerator() नहीं है। आपको ReSharper इंस्टॉल करने पर विचार करना चाहिए जो इस तरह की त्रुटियों को ठीक करना आसान बनाता है।

+0

+1 ... यह बहुत अद्भुत है। –

+0

जोएल, संपादन के लिए धन्यवाद। मुझे प्रारूपण विकल्पों के दस्तावेज कहां मिलेंगे? – Achim

+0

textarea के ऊपर नारंगी प्रश्न चिह्न। – wRAR

3

आप कुछ और कार्य को लागू करने की जरूरत है:

public class ShortCollection<T> : IList<T> 
{ 
    protected Collection<T> innerCollection; 
    protected int maxSize = 10; 

    #region IList<T> Members 

    public int IndexOf(T item) 
    { 
     return innerCollection.IndexOf(item); 
    } 

    public void Insert(int index, T item) 
    { 
     innerCollection.Insert(index, item); 
    } 

    public void RemoveAt(int index) 
    { 
     innerCollection.RemoveAt(index); 
    } 

    public T this[int index] 
    { 
     get 
     { 
      return innerCollection[index]; 
     } 
     set 
     { 
      innerCollection[index] = value; 
     } 
    } 

    #endregion 

    #region ICollection<T> Members 

    public void Add(T item) 
    { 
     innerCollection.Add(item); 
    } 

    public void Clear() 
    { 
     innerCollection.Clear(); 
    } 

    public bool Contains(T item) 
    { 
     return innerCollection.Contains(item); 
    } 

    public void CopyTo(T[] array, int arrayIndex) 
    { 
     innerCollection.CopyTo(array, arrayIndex); 
    } 

    public int Count 
    { 
     get { return innerCollection.Count; } 
    } 

    public bool IsReadOnly 
    { 
     get { return false; } 
    } 

    public bool Remove(T item) 
    { 
     return innerCollection.Remove(item); 
    } 

    #endregion 

    #region IEnumerable<T> Members 

    public IEnumerator<T> GetEnumerator() 
    { 
     return innerCollection.GetEnumerator(); 
    } 

    #endregion 

    #region IEnumerable Members 

    System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator() 
    { 
     return innerCollection.GetEnumerator(); 
    } 

    #endregion 
} 

इस कोड को संकलित कर देगा ... :)

+0

बहुत बहुत धन्यवाद! –

12

के रूप में अन्य लोगों ने कहा है, तो आप IEnumerable<T> रूप IEnumerable को लागू करने के साथ ही जरूरत है। हालांकि, IEnumberable<T> के बाद से ही implemets IEnumerable इस तुच्छ है, बस फोन अपने सामान्य GetEnumerator():

public class ShortCollection<T> : IList<T> 
{ 
    protected Collection<T> innerCollection; 
    protected int maxSize = 10; 
    public IEnumerator<T> GetEnumerator() 
    { 
     return innerCollection.GetEnumerator(); 
    } 

    IEnumerator IEnumerable.GetEnumerator() 
    { 
     return GetEnumerator(); 
    } 
} 

मैं यह सोचते कर रहा हूँ आप वास्तव में जोड़ने और innerCollection से हटाने और बस के लिए तरीके है कि संक्षिप्तता के लिए उन्हें बाहर छोड़ दिया, क्योंकि वे नहीं था हाथ से सवाल से संबंधित नहीं है।

+0

बहुत बहुत धन्यवाद! हाँ मैंने बाकी को छोड़ दिया। एक बार फिर धन्यवाद! –

+0

यह सही के रूप में चुने गए एक से बेहतर जवाब है, क्योंकि इसमें एक कोड उदाहरण है। @Bon_chan आपके चयन को बदलने पर विचार करें। –

+0

मैंने इसे हल करने की कोशिश करने में एक शर्मनाक समय बिताया। 'IENumerator IEnumerable.GetEnumerator()' के लिए +1। –