Нет перегруженной версии с этими аргументами - var param со свойством чтения / записи - PullRequest
2 голосов
/ 29 апреля 2020

У меня есть две перегруженные процедуры, из которых я хочу вызвать вторую:

function  ModifySyncProperties(AEWSItemId: String; AEvent: TcxSchedulerEvent; var AEWSChangeKey: String): Boolean; overload;
function  ModifySyncProperties(AEWSItemId: String; ATTID: Integer; ASyncID: String; var AEWSChangeKey: String): Boolean; overload;

Это происходит с ошибкой, хотя:

lSuccess := FDMExchange.ModifySyncProperties(lEWSId, lApp.EventID, lNewOutlookID, lApp.EWSItemChangeKey);

Есть нет перегруженной версии ModifySyncProperties, которая может быть вызвана с этими аргументами

Это работает, хотя:

lChangeKey := lApp.EWSItemChangeKey;
lSuccess := FDMExchange.ModifySyncProperties(lEWSId, lApp.EventID, lNewOutlookID, lChangeKey);
lApp.EWSItemChangeKey := lChangeKey;

Вот типы и переменные:

lNewOutlookID,
lEWSID,
lChangeKey     : String;
lApp           : TEWSAppointment;
lSuccess       : Boolean;

TEWSAppointment определяется в разделе interface другого модуля следующим образом:

TEWSAppointment = class
private
  FEventID: Integer;
  ...
  FEWSItemChangeKey: String;
  ...
public
  property EventID: Integer read FEventID write FEventID;
  ...
  property EWSItemChangeKey: String read FEWSItemChangeKey write FEWSItemChangeKey;
  ...
end;

Почему компилятор не принимает свойство чтения / записи lApp в качестве параметра var?

Я использую Delphi Рио 10.3.1.

1 Ответ

6 голосов
/ 29 апреля 2020

Документация для var параметров гласит:

Если в объявлении подпрограммы указан параметр var, вы должны передать присваиваемое выражение - то есть переменную, типизированную константа (в состоянии {$ J +}), разыменованный указатель, поле или индексированная переменная для подпрограммы при ее вызове.

Свойство не соответствует этому требованию.

Кроме того, документация для properties явно вызывает это:

В отличие от полей, свойства не могут быть переданы в качестве параметров var, и оператор @ не может быть применен к свойству.


На уровне реализации параметры ABI, var реализуются путем передачи адреса переменной. Поскольку свойство не обязательно имеет резервную переменную с адресом, компилятор не может напрямую получить такой адрес переменной.

Кроме того, если получатель или установщик свойства выполняют действия помимо чтения или записи в переменную, то они нужно было бы вызвать.

В принципе, по крайней мере, язык может поддерживать использование вами sh, объявив локальную переменную и скомпилировав этот код:

localVar := myProperty;
foo(localVar); 
myProperty := localVar;

Однако дизайнеры компилятора не реализовали это, когда в язык были введены свойства.

...