Коллекция <T>: почему он реализует IEnumerable и IEnumerable <T>? - PullRequest
2 голосов
/ 17 февраля 2012

Я знаю, что точно такой же вопрос появляется здесь на StackOverflow , тем не менее, он не совсем отвечает на мой запрос.

Если ICollection<T> реализует IEnumerable<T>, что расширяет IEnumerable, почему программисты из Microsoft добавили IEnumerable в качестве интерфейса, который реализует ICollection<T>?

Разве это не совсем (семантически и мудро с точки зрения реализации) то же самое, что просто написать ICollection<T> : IEnumerable<T>?

1 Ответ

5 голосов
/ 17 февраля 2012

Он говорит, что реализует IEnumerable , потому что он реализует IEnumerable.

IEnumerable<T> наследует IEnumerable, но, очевидно, не может обеспечить реализацию.Классы, которые реализуют IEnumerable<T> , также должны реализовывать IEnumerable, независимо от того, явно ли они заявляют, что они это делают.

class Foo : IEnumerable<T> 
class Foo : IEnumerable<T>, IEnumerable

В любом случае вы реализуете элементы обоих интерфейсов.Определение второго класса просто делает это очевидным для тех, кто смотрит на класс и / или документацию, что является хорошей вещью.Неопытный или иным образом неосведомленный читатель может не знать, что IEnumerable<T> приносит IEnumerable вместе с ним.Они могут не знать, что класс, который реализует IEnumerable<T>, может использоваться там, где ожидается IEnumerable.Это просто предоставляет читателю немного больше информации, что в среднем может быть хорошей вещью.

...