type c1 = class // Если объявить сначала "where T1" - тоже должно работать where T2: IComparable; where T1: T2; function f1(o: T1): integer; begin //Ошибка: Неизвестное имя 'CompareTo' Result := o.CompareTo(o); end; end; c2 = class // Если объявить сначала "where T1" - тоже должно работать where T1: T2; where T2: IComparable; function f1(o: T1): integer; begin //Ошибка: Неизвестное имя 'CompareTo' Result := o.CompareTo(o); end; end; c3 = class // Если объявить сначала "where T1" - тоже должно работать where T1: T2, System.ICloneable; where T2: IComparable; function f1(o: T1): integer; begin //Ошибка: Неизвестное имя 'CompareTo' var c := o.Clone(); Result := o.CompareTo(o); end; end; begin var a := new c1; assert(a.f1('abc') = 0); var b := new c2; assert(b.f1('abc') = 0); var c := new c3; assert(c.f1('abc') = 0); end.