unit Myc.Utils; interface type TManaged = record private type TObj = class(TInterfacedObject) FValue: T; constructor Create(AValue: T); destructor Destroy; override; end; var FIntf: IInterface; public class operator Implicit(A: T): TManaged; overload; class operator Implicit(const Upvalue: TManaged): T; overload; end; implementation constructor TManaged.TObj.Create(AValue: T); begin inherited Create; FValue := AValue; end; destructor TManaged.TObj.Destroy; begin FValue.Free; inherited; end; class operator TManaged.Implicit(A: T): TManaged; begin Result.FIntf := TObj.Create(A); end; class operator TManaged.Implicit(const Upvalue: TManaged): T; begin Result := (Upvalue.FIntf as TObj).FValue; end; end.