作为函数的结果的“函数引用”

时间:2014-09-09 13:56:44

标签: 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.

此调用(FunctionCall(GetFunction);)会导致错误。并且()的调用工作正常。

我的问题是:
在delphi中我需要使用brakets调用函数,何时不需要(我认为我从不需要它们) 或
我不应该需要它们,这是一个错误吗?

我在windows 7 dcc32上使用delphi xe5。

1 个答案:

答案 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());