Поскольку "A
является подтипом B
" , не означает, что "X<A>
является подтипом X<B>
".
Позвольте мне привести вам пример. Предположим, что CommitmentItem<T>
имеет метод Commit(T t)
, и рассмотрим следующую функцию:
void DoSomething(CommitmentItem<ITransaction> item) {
item.Commit(new SomethingElseCall());
}
Это должно работать, так как SomethingElseCall
является подтипом ITransaction
, так же как CapitalCall
.
Теперь предположим, что CommitmentItem<CapitalCall>
был подтипом CommitmentItem<ITransaction>
. Тогда вы можете сделать следующее:
DoSomething(new CommitmentItem<CapitalCall>());
Что будет? Вы получите ошибку типа в середине DoSomething
, потому что SomethingElseCall
передается там, где ожидалось CapitalCall
. Таким образом, CommitmentItem<CapitalCall>
является , а не подтипом CommitmentItem<ITransaction>
.
В Java эту проблему можно решить с помощью ключевых слов extends
и super
, ср. вопрос 2575363 . К сожалению, в C # такого ключевого слова нет.