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

标签 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;

不过,这会失败并出现错误:

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

There is no overloaded version of 'ModifySyncProperties' that can be called with these arguments

不过,这是可行的:

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 Rio 10.3.1。

最佳答案

var parameters 的文档说:

If a routine's declaration specifies a var parameter, you must pass an assignable expression - that is, a variable, typed constant (in the {$J+} state), dereferenced pointer, field, or indexed variable to the routine when you call it.

属性不符合此要求。

此外,properties 的文档明确指出这一点:

Unlike fields, properties cannot be passed as var parameters, nor can the @ operator be applied to a property.


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

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

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

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

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

关于delphi - 没有带有这些参数的重载版本 - 具有读/写属性的 var param,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61499327/

相关文章:

arrays - 数组类型可以有方法吗?

mysql - 导入数据库 phpMyAdmin - 错误格式参数不正确

python - 是否有可能使用 Python 标准库(比如 2.5 版)执行参数化的 MS-SQL 查询?

java - 为什么这个 Java 方法调用被认为是不明确的?

java - 为什么类 Cougar 需要在第 5 行实现方法的公共(public)版本,而该行没有方法(关于重载)

java - 为什么看起来调用了错误的方法?

delphi - Delphi中频繁存储、搜索和修改大数据集的最佳方法

java - 为什么这个java代码返回负值,我怎样才能将它转换为delphi?

Delphi烦恼, "find declaration"经常不起作用

c - 在 C 中将数组作为参数传递