Сообщение об ошибке относительно 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();
    }
}
8
задан mdb 5 June 2010 в 19:01
поделиться

3 ответа

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

4
ответ дан 5 December 2019 в 08:50
поделиться

Как говорили другие, вам необходимо реализовать IEnumerable , а также IEnumerable . Однако, поскольку IEnumberable сам реализует 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 и просто исключили их для краткости, поскольку они не имели отношения к рассматриваемому вопросу.

12
ответ дан 5 December 2019 в 08:50
поделиться

Вам нужно реализовать еще несколько вещей:

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
}

Этот код будет компилироваться ... :)

3
ответ дан 5 December 2019 в 08:50
поделиться
Другие вопросы по тегам:

Похожие вопросы: