Почему ICollection <T>реализует как IEnumerable <T>, так и IEnumerable - PullRequest
5 голосов
/ 05 апреля 2011

Почему ICollection<T> реализует IEnumerable<T> и IEnumerable?

Какова цель этого? Как IEnumerable приносит пользу ICollection<T>?

Ответы [ 3 ]

12 голосов
/ 05 апреля 2011

IEnumerable<T> сама заставляет любую реализацию также реализовывать неуниверсальный IEnumerable. Это безопасно по тем же причинам, по которым IEnumerable<out T> является ковариантным с .NET 4 ... вы всегда можете преобразовать T в object для неуниверсальной формы.

В основном это означает, что если у вас есть код, который использует параметр типа IEnumerable, вы все равно можете вызывать его с чем-то вроде List<T>.

Эрик Липперт недавно написал в блоге о том, почему в коллекциях реализовано много интерфейсов, а Брэд Абрамс написал в блоге в 2005 году о конкретном IEnumerable<T> / * 1017. * решение.

9 голосов
/ 05 апреля 2011

Неуниверсальный интерфейс для обратной совместимости.Если вы пишете код с использованием обобщений и хотите передать свою коллекцию в какой-либо модуль, написанный на .NET 1.0 (у которого нет обобщений), вы все равно хотите, чтобы это было успешно выполнено, и вы хотите, чтобы старый метод мог выполнять итерации по нему.1001 *

0 голосов
/ 05 апреля 2011

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

...