有这个:
procedure Foo;
begin
end;
function Bar: TProcedure;
begin
Result := Foo;
end;
以下编译:
var
tmp: TProcedure;
begin
tmp := Bar();
tmp();
...但以下内容并未在Delphi中编译:
Bar()();
是否有理由这样做"限制"? Bar()();
语法是否会在其他一些" flavor"中编译?帕斯卡? Bar()();
语法会在其他上下文中编译吗?
答案 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会自己发现问题,这可能是修复的触发器。