Параметры обобщенного типа в C# могут быть объявлены ковариантными или контравариантными. При описании обобщенного типа на C# ковариантный параметр отмечается модификатором out, а контравариантный - модификатором in:
public interfaceIEnumerable<out T>public interface IComparer<in T>
Ковариантный тип позволяет использовать вместо него любой производный класс, а контравариантный - любой надкласс этого типа.
В PascalABC.NET можно лишо пользоваться обобщенными типами с ковариантными
параметрами из стандартной библиотеки .NET. Наиболее часто используемым
обобщенным типом с ковариантными параметрами является
IEnumerable<out
T>,
который в PascalABC.NET представлен типом sequence of T.
Основное использование ковариантности здесь заключается в том, что вместо
sequence of Base можно подставлять
sequence of Derived, где Derived - производный
класс, а Base - базовый. Например:
begin
var a: sequence of object;
var b: sequence of integer;
a := b;
a := Arr(1,2,3);
a := new List<DateTime>;
end.
Следует обратить внимание, что
array of integer можно присвоить переменной типа
sequence of integer согласно принципу подстановки, а
sequence of integer можно присвоить переменной типа
sequence of object за счет ковариантности. Именно
поэтому присваивание a := Arr(1,2,3) допустимо.