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.
如果您报告的内容是正确的(请参阅下文了解更多信息),那么我相信您会发现一个错误。
这段代码:
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)
| 归档时间: |
|
| 查看次数: |
539 次 |
| 最近记录: |