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

前端之家收集整理的这篇文章主要介绍了“Delphi中的记录类型属性的左侧无法分配给”前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我很好奇,为什么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;
...

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

猜你在找的Delphi相关文章