Почему параметры универсального типа C # нарушают ковариацию?

Мне неясно, почему следующий фрагмент кода не является ковариантным?

  public interface IResourceColl<out T> : IEnumerable<T> where T : IResource {

    int Count { get; }

    T this[int index] { get; }

    bool TryGetValue( string SUID, out T obj ); // Error here?
    }

Ошибка 1 Недопустимая дисперсия: параметр типа 'T' должен быть неизменным действительно для IResourceColl.TryGetValue (string, out T). 'T' - это ковариантный.

Мой интерфейс использует параметр шаблона только в позициях вывода. Я мог бы легко реорганизовать этот код до чего-то вроде

  public interface IResourceColl<out T> : IEnumerable<T> where T : class, IResource {

    int Count { get; }

    T this[int index] { get; }

    T TryGetValue( string SUID ); // return null if not found
    }

, но я пытаюсь понять, действительно ли мой исходный код нарушает ковариацию, или это ограничение ковариации компилятором или .NET.

12
задан casperOne 18 January 2012 в 16:50
поделиться