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