Я получаю это сообщение об ошибке, и я не могу выяснить почему!
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();
}
}
IEnumerable
и IEnumerable
- разные интерфейсы, и ваш код должен реализовать оба. Ваш код реализует только GetEnumerator() из IEnumerable
, но не GetEnumerator() из IEnumerable
. Вам следует рассмотреть возможность установки ReSharper, который позволяет легко исправлять ошибки, подобные этой.
Как говорили другие, вам необходимо реализовать 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
и просто исключили их для краткости, поскольку они не имели отношения к рассматриваемому вопросу.
Вам нужно реализовать еще несколько вещей:
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
}
Этот код будет компилироваться ... :)