如何为相互依赖的记录定义隐式转换运算符?

Ric*_*d A 13 delphi delphi-2006

我在Delphi 2006中使用运算符重载记录.(请不要告诉我不要回答这个问题.)

我有两个记录类型,隐式运算符重载.它们都只是在模块的实现中,而不是通过接口公开.

我的问题是,既然它们是相互依赖的,我不知道如何将第二种类型转发给编译器.我知道如何使用函数,过程和类来执行此操作,但不知道如何使用记录.

这是我想要做的简化示例:

implementation

type
  TMyRec1 = record
    Field1 : Integer;
    class operator Implicit(a: TMyRec2): TMyRec1;  // <---- Undeclared Identifier here.
  end;

  TMyRec2 = record
    Field2: Integer;
    class operator Implicit(a: TMyRec1): TMyRec2;
  end;

class operator TMyRec1.Implicit(a:TMyRec2): TMyRec1;
begin
  Result.Field1 := a.Field2;
end;

class operator TMyRec2.Implicit(a:TMyRec2): TMyRec2;
begin
  Result.Field2 := a.Field1;
end;
Run Code Online (Sandbox Code Playgroud)

Rob*_*edy 13

您不能拥有记录类型的前向声明.Implicit在第二种类型中定义两个运算符:

type
  TMyRec1 = record
    Field1 : Integer;
  end;

  TMyRec2 = record
    Field2: Integer;
    class operator Implicit(a: TMyRec2): TMyRec1;
    class operator Implicit(a: TMyRec1): TMyRec2;
  end;
Run Code Online (Sandbox Code Playgroud)

引自帮助:

只有在绝对必要时才应提供隐式转换,并应避免反身性.最好让类型B隐式地将自身转换为类型A,并且让类型A不知道类型B(反之亦然).