我有一个返回TFunc<Integer>
函数reference to function:Integer
的函数。
我有一个过程,它以函数TFunc<Integer>
作为参数,调用它并打印其结果。
program Project1;
{$APPTYPE CONSOLE}
{$R *.res}
uses
System.SysUtils;
function GetFunction:TFunc<Integer>;
begin
result := function:Integer begin result := 42 end;
end;
procedure FunctionCall(AFunc:TFunc<Integer>);
var i:Integer;
begin
i := AFunc;
WriteLn(Format('Function Result = %d',[i]));
end;
begin
// FunctionCall(GetFunction); // error
FunctionCall(GetFunction()); // works as excpected
end.
此调用(FunctionCall(GetFunction);
)会导致错误。并且()
的调用工作正常。
我的问题是:
在delphi中我需要使用brakets调用函数,何时不需要(我认为我从不需要它们)
或
我不应该需要它们,这是一个错误吗?
我在windows 7 dcc32上使用delphi xe5。
答案 0 :(得分:4)
如果您报告的内容是正确的(请参阅下面的详细信息),那么您会发现一个错误,我相信。
此代码:
FunctionCall(GetFunction);
不应该编译。实际上,当我尝试在XE3,XE4,XE5,XE6和XE7中编译它时,它不会编译。它不会编译,因为在此特定上下文中,编译器将GetFunction
解释为类型
function: TFunc<Integer>
所有上述编译器都对此错误消息:
[dcc32 Error] E2010 Incompatible types: 'System.SysUtils.TFunc' and 'Procedure'
所以,如果你有某种方式(可能有一些编译器选项),设法使代码编译然后我只能相信这是由于一个错误。
您应该通过应用括号来解决这个问题,以便编译器能够理解您希望调用GetFunction
,而不是引用它。
FunctionCall(GetFunction());