Прежде всего, поддержка со-/ контравариантности является обязательной.Вам нужно добавить квалификаторы out
или in
к параметру универсального типа, чтобы он работал (на интерфейсе, а не на классе).Таким образом, вы должны иметь:
interface IMyList<(in/out) T> : ...
Во-вторых, вы не можете сделать это в своем примере, потому что ваш параметр T
является одновременно-1007 * и контравариантным.Для упрощения параметр типа, который возвращается только классом, может быть ковариантным (он же out
), а параметр типа, который принимается только классом, является контравариантным (он же in
).Ваш класс принимает и возвращает T
.
Наконец, ваша реальная проблема в том, что Dictionary<K,V>
не IEnumerable<V>
, а IEnumerable<KeyValuePair<K,V>>
.Вам нужно переопределить метод GetEnumerator в MyList следующим образом:
public class MyList<T> : Dictionary<int, T>, IEnumerable<T> where T : KeyedBase
{
public void Add(T itm)
{
Add(itm.Key, itm);
}
public virtual IEnumerator<T> GetEnumerator()
{
return Values.GetEnumerator();
}
}
Ваш пример должен сработать.