没有带有这些参数的重载版本 - 带有读/写属性的 var param

Jan*_*gen 2 delphi parameters overloading delphi-10.3-rio

我有两个重载过程,我想调用其中的第二个:

function  ModifySyncProperties(AEWSItemId: String; AEvent: TcxSchedulerEvent; var AEWSChangeKey: String): Boolean; overload;
function  ModifySyncProperties(AEWSItemId: String; ATTID: Integer; ASyncID: String; var AEWSChangeKey: String): Boolean; overload;
Run Code Online (Sandbox Code Playgroud)

但是,这失败并出现错误:

lSuccess := FDMExchange.ModifySyncProperties(lEWSId, lApp.EventID, lNewOutlookID, lApp.EWSItemChangeKey);
Run Code Online (Sandbox Code Playgroud)

没有可以使用这些参数调用的“ModifySyncProperties”的重载版本

不过,这有效:

lChangeKey := lApp.EWSItemChangeKey;
lSuccess := FDMExchange.ModifySyncProperties(lEWSId, lApp.EventID, lNewOutlookID, lChangeKey);
lApp.EWSItemChangeKey := lChangeKey;
Run Code Online (Sandbox Code Playgroud)

以下是类型和变量:

lNewOutlookID,
lEWSID,
lChangeKey     : String;
lApp           : TEWSAppointment;
lSuccess       : Boolean;
Run Code Online (Sandbox Code Playgroud)

TEWSAppointmentinterface另一个单元的部分中定义为:

TEWSAppointment = class
private
  FEventID: Integer;
  ...
  FEWSItemChangeKey: String;
  ...
public
  property EventID: Integer read FEventID write FEventID;
  ...
  property EWSItemChangeKey: String read FEWSItemChangeKey write FEWSItemChangeKey;
  ...
end;
Run Code Online (Sandbox Code Playgroud)

为什么编译器不接受读/写lApp属性作为var参数?

我正在使用 Delphi Rio 10.3.1。

Dav*_*nan 6

var参数的文档说:

如果例程的声明指定了 var 参数,则必须在调用例程时向例程传递一个可赋值表达式 - 即变量、类型常量(处于 {$J+} 状态)、取消引用的指针、字段或索引变量。

物业不符合此要求。

此外,属性文档明确指出:

与字段不同,属性不能作为 var 参数传递,@ 运算符也不能应用于属性。


在实现层面,ABI,var参数是通过传递变量的地址来实现的。由于属性不一定有带地址的后备变量,因此编译器无法直接获取这样的变量地址。

此外,如果属性 getter 或 setter 执行超出读取或写入变量的操作,则需要调用它们。

原则上,至少该语言可以通过声明局部变量并编译以下代码来支持您希望的用法:

localVar := myProperty;
foo(localVar); 
myProperty := localVar;
Run Code Online (Sandbox Code Playgroud)

然而,当属性被引入语言时,编译器的设计者并没有实现这一点。