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