Delphi 中记录类型属性的“左侧无法分配给”

2023-12-11

我很好奇为什么 Delphi 将记录类型属性视为只读:

  TRec = record
    A : integer;
    B : string;
  end;

  TForm1 = class(TForm)
  private
    FRec : TRec;
  public
    procedure DoSomething(ARec: TRec);
    property Rec : TRec read FRec write FRec;
  end;

如果我尝试将值分配给 Rec 属性的任何成员,我将收到“左侧无法分配给”错误:

procedure TForm1.DoSomething(ARec: TRec);
begin
  Rec.A := ARec.A;
end;

同时允许对底层字段执行相同的操作:

procedure TForm1.DoSomething(ARec: TRec);
begin
  FRec.A := ARec.A;
end;

这种行为有什么解释吗?


由于“Rec”是一个属性,编译器对它的处理方式略有不同,因为它必须首先评估属性 decl 的“读取”。考虑一下,它在语义上与您的示例等效:

...
property Rec: TRec read GetRec write FRec;
...

如果你这样看,你会发现对“Rec”的第一次引用(在点“.”之前)必须调用 GetRec,这将创建 Rec 的临时本地副本。这些临时对象被设计为“只读”。这就是你遇到的情况。

您可以在这里做的另一件事是将记录的各个字段分解为包含类的属性:

...
property RecField: Integer read FRec.A write FRec.A;
...

这将允许您通过属性直接分配给类实例中嵌入记录的字段。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Delphi 中记录类型属性的“左侧无法分配给” 的相关文章

随机推荐