В чем разница между IEnumerable и IEnumerable<T>?
Я видел много классов фреймворка, реализующих оба этих интерфейса, поэтому я хотел бы знать, какие преимущества можно получить при реализации обоих?
Посмотрите, как они были определены:
public interface IEnumerable
{
[DispId(-4)]
IEnumerator GetEnumerator();
}
public interface IEnumerable<T> : IEnumerable
{
IEnumerator<T> GetEnumerator();
}
Как мы видим, IEnumerable<T> происходит от IEnumerable, это означает, что любой IEnumerable имеет, IEnumerable<T> наследует, то почему мы реализуем оба, а не только IEnumerable<T>? Не реализует IEnumerable<T> недостаточно?
Аналогично, существуют и другие аналогичные пары:
-
IListиIList<T> -
ICollectionиICollection<T>
Я также хотел бы узнать об этом.