调用函数返回的过程

时间:2014-08-12 07:40:19

标签: delphi pascal

有这个:

procedure Foo;
begin
end;

function Bar: TProcedure;
begin
  Result := Foo;
end;

以下编译:

var
  tmp: TProcedure;
begin
  tmp := Bar();
  tmp();

...但以下内容并未在Delphi中编译:

Bar()();

是否有理由这样做"限制"? Bar()();语法是否会在其他一些" flavor"中编译?帕斯卡? Bar()();语法会在其他上下文中编译吗?

2 个答案:

答案 0 :(得分:6)

只需拨打

即可
TProcedure(Bar());

答案 1 :(得分:3)

我认为语言的语法没有限制。声明Bar()()应该有效。所以,我相信这是旧版Delphi中的编译器错误。该程序在Delphi 2010及更高版本中编译:

{$APPTYPE CONSOLE}

uses
  SysUtils;

procedure Foo;
begin
end;

function Bar: TProcedure;
begin
  Result := Foo;
end;

begin
  Bar()();
end.

很可能在Delphi 2010之前修复了编译器错误,这就是我必须提供的版本。看起来这个bug仍然存在于Delphi 7中,并由Delphi 2010修复。因此该错误似乎已在这两个版本之间的某处修复。

更新1

Marco报告Free Pascal编译器接受Bar()()

更新2

Rudy做了一些测试并报告说这个bug仍然存在于D2007中,因此修复版本是D2009和D2010。我的直觉告诉我,当添加匿名方法功能时,Embarcadero会自己发现问题,这可能是修复的触发器。