Что означают вложенные дженерики в C #? - PullRequest
5 голосов
/ 10 августа 2010

Немного простой вопрос, но, тем не менее, кажется, что он меня озадачил.

Учитывая "вложенный универсальный":

IEnumerable<KeyValuePair<TKey, TValue>>

Означает ли это, что IEnumerable может иметь универсальные типы, которые сами являются типами KeyValuePair?

Спасибо

Scott

Ответы [ 4 ]

6 голосов
/ 10 августа 2010

Да. Тип KeyValuePair ожидает два параметра общего типа. Мы можем либо заполнить их, указав на конкретные типы:

IEnumerable<KeyValuePair<string, int>>

Или мы можем заполнить их, используя другие общие параметры, уже указанные внешним классом:

class Dictionary<TKey, TValue> : IEnumerable<KeyValuePair<TKey, TValue>>

Параметры общего типа всегда указываются «при использовании» или в точке, где вы используете класс или метод, который требует их. И, как и любой другой параметр, вы можете заполнить его постоянным, жестко запрограммированным значением (или типом в данном случае) или другой переменной.

1 голос
/ 10 августа 2010

В скорлупе ореха это означает, что когда вы перечислите значение, превышающее IEnumerable, вы получите KeyValuePair<TKey, TValue> (для любых типов TKey и TValue установлены в).

Итак, да.

1 голос
/ 10 августа 2010

Да, это «IEnumerable из пар ключ / значение».Это будет объявлено так:

IEnumberable<KeyValuePair<string, string>> reallyComplicatedDictionary =
    new IEnumerable<KeyValuePair<string, string>>();

или аналогично.

Единственное, о чем я могу подумать, это конкретное использование, которое я могу сделать, это позволить вам иметь «словарь» с повторяющимися ключами.

0 голосов
/ 10 августа 2010

Здесь

IEnumerable<KeyValuePair<string, int>>

Сам IEnumerable не является универсальным.Он знает, что он будет содержать KeyValuePair.Здесь KeyValuePair является универсальным, который может содержать любые 2 универсальных типа.

...