Ковариантность параметров обобщенных типов

Параметры обобщенного типа в C# могут быть объявлены ковариантными или контравариантными. При описании обобщенного типа на C# ковариантный параметр отмечается модификатором out, а контравариантный - модификатором in:

public interface IEnumerable<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) допустимо.