Почему это не работает ?: var foo = (ICollection <IBar>)list;
Допустим, T = Foo
и есть второй класс Foo2 : IBar
.
Тогда вы можете продолжитькак это:
var foolist = (ICollection <IBar>)list;
foolist.Add(new Foo2()); // compiles, since Foo2 also implements IBar
Черт!У вас есть нарушение типа во время выполнения, поскольку вы пытались добавить Foo2
к List<Foo>
.
Чтобы избежать этого, ICollection<Foo>
- это , а не подтип ICollection<IBar>
хотя Foo
является подтипом IBar
.Теория, лежащая в основе этого, является со-и контравариантностью .