Вы не можете сделать это, потому что генерики не являются ковариантными.То есть тип itr<derived1>
не может быть преобразован в itr<base>
, хотя derived1
может быть преобразован в base
.
. Вот пример того, почему с использованием класса List<T>
каркаса:
List<string> list1 = new List<string>();
list1.Add("Hello, World!");
// This cast will fail, because the following line would then be legal:
List<object> list2 = (List<object>)list1;
// ints are objects, but they are not strings!
list2.Add(1);
Таким образом, доступ к list1[1]
вернет в штучной упаковке int
в списке, который, как было объявлено, содержит string
s.
Следовательно, это приведение не разрешено, так как оно прерветсясистема типов.
(В качестве примечания в разделе where t : class, base
вам не нужно указывать class
. base
сам по себе является ссылочным типом, поэтому ограничение class
является избыточным.)