これを持っている:
procedure Foo;
begin
end;
function Bar: TProcedure;
begin
Result := Foo;
end;
以下をコンパイルします。
var
tmp: TProcedure;
begin
tmp := Bar();
tmp();
...しかし、以下はDelphiでコンパイルされません。
Bar()();
この「制限」には理由がありますか?DOESBar()();
パスカルのいくつかの他の「味」に構文コンパイル?ですがBar()();
、いくつかの他のコンテキストでコンパイル構文?
言語の文法に制限はないと思います。ステートメントBar()()
は有効である必要があります。したがって、これは古いバージョンのDelphiのコンパイラのバグであると思います。このプログラムはDelphi2010以降でコンパイルされます。
{$APPTYPE CONSOLE}
uses
SysUtils;
procedure Foo;
begin
end;
function Bar: TProcedure;
begin
Result := Foo;
end;
begin
Bar()();
end.
コンパイラのバグがDelphi2010の前に修正された可能性は十分にあります。それは、私が渡さなければならないバージョンです。バグはDelphi7にまだ存在し、Delphi 2010で修正されているようです。したがって、バグはこれら2つのバージョンの間のどこかで修正されているようです。
アップデート1
Marcoは、FreePascalコンパイラがを受け入れると報告していますBar()()
。
アップデート2
Rudyはいくつかのテストを行い、バグがD2007にまだ存在していることを報告しているため、修正はD2009とD2010のいずれかでした。私の本能は、Embarcaderoが匿名メソッド機能を追加するときに問題を自分で発見し、それが修正が行われるきっかけになったと言っています。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加