首页 > 解决方案 > Delphi 编译器错误 E2382 无法使用实例变量调用构造函数的解释

问题描述

我有这个记录(顺便说一句,它也可以是一个类,但有了记录,这段代码更有意义):

interface

type
  TMyRecord = record
    A: Integer;
    constructor Initialize(V: Integer);
    procedure InitOne;
  end;

implementation

constructor TMyRecord.Initialize(V: Integer);
begin
  A := V;
end;

(暂时省略方法 InitOne 的实现)。

据我所知,记录构造函数既可以以函数形式调用,例如类的常规构造函数,也可以以过程形式直接在记录变量上调用(参考:Delphi 中的记录构造函数)。

鉴于此,此代码可以按预期编译和工作:

procedure DoSomething;
var
  pMyRec: TMyRecord;
begin
  pMyRec.Initialize(1);              // constructor called in procedural form
  pMyRec := TMyRecord.Initialize(1); // constructor called in functional form
end;

虽然 InitOne 的这个实现没有:

procedure TMyRecord.InitOne;
begin
  Self.Initialize(1);              // constructor called in procedural form <-- E2382
  Self := TMyRecord.Initialize(1); // constructor called in functional form
end;

为什么?不Self.Initialize(1)应该与 相同pMyRec.Initialize(1),两者都称为作用于其“实例”的过程?

标签: delphiconstructorrecord

解决方案


推荐阅读