Как IEnumerable <T>Contra-вариант? - PullRequest
4 голосов
/ 11 июля 2010

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

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

1 Ответ

9 голосов
/ 11 июля 2010

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

Из MSDN (IEnumerable <(Of <(T>)>) Interface) у нас есть что:

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

out 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) Образцы

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...