Преобразование списка <T>(где T: IBar) в ICollection <IBar>завершается неудачно - PullRequest
1 голос
/ 29 сентября 2011

У меня есть classT, реализация interfaceIBar.

У меня есть переменная list типа List<T>.

Два вопроса для улучшения моего понимания языка:

  • Почему это не работает?

    var foo = (ICollection <IBar>)list; // fails!

  • Как обойти это (если возможно)?

1 Ответ

5 голосов
/ 29 сентября 2011

Почему это не работает ?: 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.Теория, лежащая в основе этого, является со-и контравариантностью .

...