Мне неясно, почему следующий фрагмент кода не является ковариантным?
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.