Объяснение Delphi ошибка компилятора E2382 Невозможно вызвать конструкторы, используя переменные экземпляра - PullRequest
0 голосов
/ 11 марта 2020

У меня есть эта запись (кстати, это также может быть класс, но с записями этот код имеет больше смысла):

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), оба вызваны как процедура, действующая на его "экземпляр"?

...