我有两个重载过程,我想调用其中的第二个:
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/