Почему IDictionary <TKey, TValue> реализует как ICollection, так и IEnumerable - PullRequest
0 голосов
/ 04 мая 2018

Я просматривал метаданные, сгенерированные для интерфейса IDictionary<TKey, TValue>, и заметил, что он реализует

public interface IDictionary<TKey, TValue> : ICollection<KeyValuePair<TKey, TValue>>, IEnumerable<KeyValuePair<TKey, TValue>>, IEnumerable

Разве это не избыточно? Глядя на метаданные ICollection<T>, видно, что он уже реализует IEnumerable<T>, IEnumerable

И почему IEnumerable<T> подразумевает IEnumerable, а ICollection<T> не реализует ICollection?

Ответы [ 2 ]

0 голосов
/ 04 мая 2018

Читать это . Это объясняет все, что вы хотите знать о вашем первом вопросе.

Цитирую наиболее значимую часть:

Почему такие инструменты, как Reflector или обозреватель объектов, отображают весь список?

Эти инструменты не имеют исходного кода. У них есть только метаданные работать из. Поскольку указывать полный список необязательно, инструмент не имеет Идея, содержит ли исходный код полный список или нет. Лучше ошибиться на стороне дополнительной информации. Опять же инструмент пытается помочь вам, показывая вам больше информации , чем скрытие информации, которая может вам понадобиться .

0 голосов
/ 04 мая 2018

Метаданные показывают все реализованные интерфейсы, особенно те, которые получены посредством наследования. Если вы посмотрите на справочный источник из IDictionary<TKey, TValue>, вы увидите, что фактическая реализация реализует только ICollection<KeyValuePair<TKey, TValue>>:

public interface IDictionary<TKey, TValue> : ICollection<KeyValuePair<TKey, TValue>>
...