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