unit tw18688; {$mode delphi}{$H+} interface uses Classes, SysUtils; type IValueHolder = interface function GetT:T; procedure SetT(NewValue:T); end; TValueHolder = class (TInterfacedObject, IValueHolder) private FValue: T; public constructor Create; destructor Destroy; override; function GetT:T; procedure SetT(NewValue:T); end; RValueHolder = record private type _IValueHolder = IValueHolder; _TValueHolder = TValueHolder; var Ptr: _IValueHolder; function GetImpl: _IValueHolder; public class operator Implicit (a:RValueHolder):T; inline; class operator Implicit (a:T):RValueHolder; inline; function GetValue:T; inline; property V:T read GetValue; end; //TObjectValue = TValueHolder ; // works if not commented TObjectValue2 = RValueHolder ; implementation constructor TValueHolder .Create; begin FValue := nil end; destructor TValueHolder .Destroy; begin FreeAndNil(FValue); inherited; end; function TValueHolder .GetT:T; begin Result := FValue; end; procedure TValueHolder .SetT(NewValue:T); begin if FValue <> NewValue then begin FreeAndNil(FValue); FValue := NewValue; end; end; function RValueHolder.GetImpl: _IValueHolder; begin if Pointer(Ptr) = nil then begin Ptr := _TValueHolder.Create; end; Result := Ptr; end; class operator RValueHolder.Implicit (a:RValueHolder):T; begin Result:=a.V; end; class operator RValueHolder.Implicit (a:T):RValueHolder; begin Result.GetImpl.SetT(a); end; function RValueHolder.GetValue:T; begin Result := GetImpl.GetT; end; end.