Как IEnumerable‹T› Contra-вариант?

Это сообщение (http://blogs.msdn.com/b/brada/archive/2005/01/18/355755.aspx) говорит, что IEnumerable<T> является Contra-вариантом. Однако тип T является ковариантным, потому что это параметр out. Итак, в каком контексте IEnumerable<T> контравариант ??

Надеюсь, я не путаю! Спасибо за ответы заранее!


person Mahi Satyanarayana    schedule 11.07.2010    source источник


Ответы (1)


IEnumerable не является контрвариантом. Это ковариантно.

Из MSDN (IEnumerable ‹(Из ‹(T›)›) интерфейса) у нас есть это:

Параметры типа

из Т

Тип объектов для перечисления. Этот параметр типа является ковариантным. То есть вы можете использовать либо указанный вами тип, либо любой более производный тип.

Из этого сообщения мы получаем следующее:

Библиотека базовых классов была обновлена ​​для поддержки ковариантности и контравариантности в различных часто используемых интерфейсах. Например, IEnumerable теперь является ковариантным интерфейсом — IEnumerable.

Образец кода:

// Covariant parameters can be used as result types
interface IEnumerator<out T>
{
     T Current { get; }

     bool MoveNext();
}

// Covariant parameters can be used in covariant result types 
interface IEnumerable<out T>
{
     IEnumerator<T> GetEnumerator();
}

// Contravariant parameters can be used as argument types 
interface IComparer<in T>
{
     bool Compare(T x, T y); 
}

Дополнительные примеры по этому поводу см.

Часто задаваемые вопросы о ковариантности и контравариантности

Ковариантность и контравариантность в C#, часть первая (большая серия постов Эрика Липперта о ковариантности и контравариантности)

Понимание примеров ковариантности и контравариантности C# (3)

person Leniel Maccaferri    schedule 11.07.2010
comment
Более того: запись в блоге, указанная в вопросе, неверна. Писатель перепутал ко- и контравариантность. Что легко сделать, имхо... - person Stephen Cleary; 11.07.2010
comment
Точно. Брэд противоречит сам себе в посте. - person Leniel Maccaferri; 11.07.2010
comment
Вот что я думал. Однако, поскольку в сообщении в блоге упоминалось, что оно исходит от Андерса — архитектора и гуру C#, я сомневался! Спасибо за разъяснение. - person Mahi Satyanarayana; 12.07.2010