type c1 = class where T1: IComparable; function f1(o: T2): integer; where T2: T1; begin Result := {T1}(o).CompareTo({T1}(o)); end; end; begin var a := new c1; assert(a.f1('abc') = 0); end.