uses System.SysUtils; type Func<T, R> = reference to function(const Arg: T): R; type Alg = record class procedure Exec<T, R>(const f: Func<T, R>); overload; static; end; { Alg } class procedure Alg.Exec<T, R>(const f: Func<T, R>); begin end; type TRec = record x: integer; end; TRecHelper = record helper for TRec function ToString: string; overload; inline; class function ToString(const Value: TRec): string; overload; inline; static; end; { TRecHelper } function TRecHelper.ToString: string; begin end; class function TRecHelper.ToString(const Value: TRec): string; begin end; begin Alg.Exec<integer, string>(integer.ToString); // Works in D10, barfs in D10.1 Alg.Exec<TRec, string>(TRec.ToString); // Barfs in either end.