Разница между ковариантностью и контравариантностью в универсальных типах заключается в том, что они позволяют использовать вместо некоторого типа другой тип, который находится ниже или выше в иерархии наследования: 1
Таким образом, ковариантность сохраняет иерархию наследования исходных типов в производных типах в том же порядке, а контравариантность обращает иерархию исходных типов на противоположную в производных типах. 3