作为函数的结果的"函数引用"

lin*_*luk 6 delphi function-pointers delphi-xe5

我有一个返回函数的功能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.
Run Code Online (Sandbox Code Playgroud)

这个call(FunctionCall(GetFunction);)会导致错误.和()作品一样被打电话.

我的问题是:
在delphi中我需要使用brakets来调用函数,何时不需要(我认为我从不需要它们)
或者
我不需要它们而且它是否是一个bug?

我在windows 7 dcc32上使用delphi xe5.

Dav*_*nan 4

如果您报告的内容是正确的(请参阅下文了解更多信息),那么我相信您会发现一个错误。

这段代码:

FunctionCall(GetFunction);
Run Code Online (Sandbox Code Playgroud)

不应该编译。事实上,当我尝试在 XE3、XE4、XE5、XE6 和 XE7 中编译它时,它无法编译。它不会编译,因为在这个特定的上下文中,编译器将其解释GetFunction为类型

function: TFunc<Integer>
Run Code Online (Sandbox Code Playgroud)

所有上述编译器都反对此错误消息:

[dcc32 错误] E2010 不兼容的类型:“System.SysUtils.TFunc”和“Procedure”

因此,如果您以某种方式(也许使用某些编译器选项)设法使该代码编译,那么我只能相信这是由于错误造成的。

您应该通过应用括号来处理这个问题,以便编译器可以理解您希望调用GetFunction而不是引用它。

FunctionCall(GetFunction());
Run Code Online (Sandbox Code Playgroud)