2010-06-05 32 views
8

Bu hata iletisini alıyorum ve nedenini anlayamıyorum!IEnumerable.GetEnumerator() ile ilgili bir hata iletisi

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 

İşte GetEnumerator() uygulamasının bulunduğu kod. Sorun nedir?

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

Sadece IEnumerable ve IEnumerable uygulamalarında innerCollection nesnesini kullanmayın. Aşağıdaki kod yazılan cevabın tam koduna bakın ... – code4life

+1

Hata mesajının size * tam olarak * burada neyin yanlış gittiğini söylüyorum: IEnumerable uygulanmadı, uygulanmasının gerekli olduğu ve tek yöntemin Bunu uygulayabilir yanlış dönüş tipi vardır. Bu oldukça karmaşık bir hata analizini zaten aldı ve problemi kendi başınıza teşhis etmenize izin vermek için yeterli değildi. Farklı bir hata mesajı daha yararlı oldu mu? Ne tür bir hata mesajı, yardım sormadan sorunu teşhis etmenizi sağlayabilirdi? –

+0

Ben bir acemi ve Wrox (acemi) Visual C# kitap okuyorum. Kitapta bile belirtmediğim için IEnumerable ve IEnumerable 'u uygulamak zorunda olduğumu bilmiyordum. Ayrıca bu kod egzersizin cevabıydı (baskıdan önce kodu kontrol edip etmediklerini merak etmek). Msdn web sitesine ve wrox forumuna bir göz attım ama onlar da bundan bahsetmiyorlar. IEnumerable'ın öğrenmem için oldukça zor olduğunu söylemeliyim. Ama şimdi hatayı tekrar okuduğumda, bunun mantıklı olduğunu kabul ediyorum. –

cevap

4

IEnumerable ve IEnumerable<T> farklı arayüzler ve kod hem uygulamak zorundadır. Kodunuz yalnızca IEnumerable<T>'un GetEnumerator() öğesini uygular, ancak IEnumerable'un GetEnumerator() öğesini kullanmaz. Bunun gibi hataları düzeltmeyi kolaylaştıran ReSharper'ı yüklemeyi düşünmelisiniz.

+0

+1… oldukça şaşırtıcı. –

+0

Joel, düzenleme için teşekkürler. Biçimlendirme seçeneklerinin belgelerini nerede bulabilirim? Textarea'nın üstünde – Achim

+0

turuncu soru işareti. – wRAR

3

Sen birkaç şey daha uygulamak gerekir: Diğerleri söylediler

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 
} 

Bu kod derlemek olacak ... :)

+0

Çok teşekkür ederim! –

12

olarak, IEnumerable<T> yanı sıra IEnumerable uygulamak gerekir. Ancak, IEnumberable<T> beri kendisi bu önemsiz IEnumerable implemets, sadece çağrı Sen jenerik GetEnumerator(): onlar değil mi beri

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(); 
    } 
} 

Ben aslında sadece ekleme ve innerCollection kaldırma ve için yöntemler olduğunu tahmin ediyorum kısalık için onları dışarı bıraktı Eldeki soruyla ilgili değil.

+0

Çok teşekkür ederim! Evet diğerlerini bıraktım. Tekrar teşekkürler! –

+0

Bu, bir kod örneği içerdiğinden, doğru olarak seçilenlerden çok daha iyi bir yanıttır. @Bon_chan seçiminizi değiştirmeyi düşünün. –

+0

Bunu çözmek için utanç verici bir zaman harcadım. IEnumerator IEnumerable.GetEnumerator() 'için +1. –