2010-06-05 3 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

Просто не бросайте объект innerCollection для реализаций IEnumerable и IEnumerable . Посмотрите мой полный код в опубликованном ответе ниже ... – code4life

+1

Я заметил, что сообщение об ошибке сообщает вам * точно, что здесь происходит неправильно: IEnumerable не был реализован, что он должен быть реализован и что единственный метод который может реализовать его, имеет неправильный тип возврата. Это уже привело к довольно сложному анализу ошибок, но этого было недостаточно, чтобы позволить вам самостоятельно диагностировать проблему. Было ли более полезным сообщение об ошибке? Какое сообщение об ошибке позволило бы вам диагностировать проблему, не прося о помощи? –

+0

Я новичок и читаю книгу Wrox (новичок) Visual C#. Я не знал, что мне нужно было реализовать IEnumerable и IEnumerable , поскольку это даже не упоминается в книге. Плюс этот код был ответом упражнения (интересно, проверяли ли они код перед печатью). Я посмотрел на сайт msdn и форум wrox, но они не упоминают об этом. Должен сказать, IEnumerable для меня довольно трудно учиться. Но теперь, когда я снова прочитал ошибку, я согласен, что имеет смысл. –

ответ

4

IEnumerable и IEnumerable<T> различные интерфейсы и ваш код должен реализовать оба. Ваш код реализует только GetEnumerator() IEnumerable<T>, но не GetEnumerator() IEnumerable. Вы должны рассмотреть возможность установки ReSharper, который позволяет легко исправить ошибки, подобные этой.

+0

+1 для Resharper (R #) ... это довольно удивительно. –

+0

Joel, спасибо за редактирование. Где найти документацию по параметрам форматирования? – 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, а также IEnumerable<T>. Однако, так как 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

Я потратил неловкое количество времени, пытаясь решить это. +1 для 'IEnumerator IEnumerable.GetEnumerator()'. –

Смежные вопросы