.NET 4.0 представил ковариацию и контравариантность универсальных типов . Вот что это значит.
ковариации
Ключевое слово Out
здесь указывает, что типом является ковариант . Ковариантный тип T(Of D)
может быть приведен к типу T(Of B)
, где D выводится из B. Это возможно, когда тип T(Of D)
когда-либо использует только значения D в качестве выходных данных (отсюда и слово Из ).
Например, интерфейс IEnumerable(Of Out T)
является ковариантным, поскольку ни один из его методов не принимает параметры типа T
. Следовательно, IEnumerable(Of String)
может быть приведен как IEnumerable(Of Object)
- если он обеспечивает перечислимый доступ к строкам, то он обеспечивает перечислимый доступ к объектам (поскольку строки являются объектами).
контрвариация
И наоборот, ключевое слово In
может применяться к типу, который имеет право на Контравариантность . Контравариантный тип T(Of B)
может быть приведен к типу T(Of D)
, где D выводится из B. Это возможно, когда тип T(Of B)
использует только значения B в качестве input (отсюда и слово In ). Другими словами, контравариантность является полной противоположностью ковариации.
Хороший пример контравариантного типа - интерфейс IComparer(Of In T)
. Этот интерфейс не предоставляет методов, которые возвращают значения T
; следовательно, IComparer(Of Object)
может быть приведен как IComparer(Of String)
- в конце концов, если он может сравнивать объекты, он может сравнивать строки.