2014-09-09 4 views
6

Ich habe eine Funktion, die eine Funktion TFunc<Integer> zurückgibt, die reference to function:Integer ist. und ich habe eine Prozedur, die eine Funktion TFunc<Integer> als Argument, ruft es und druckt das Ergebnis."Referenz auf Funktion" als Ergebnis einer Funktion

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. 

dieser Aufruf (FunctionCall(GetFunction);) führt zu einem Fehler. und der Anruf mit () funktioniert wie erwartet.

meine Frage ist:
wenn in delphi lese ich brakets benötigen und eine Funktion aufzurufen, wenn nicht (ich dachte, ich brauche sie nie)
oder
sollte ich sie nicht brauchen, und es ist ein Fehler?

Ich arbeite mit Delphi Xe5 auf Windows 7 dcc32.

Antwort

4

Wenn das, was Sie melden, korrekt ist (und unten mehr darüber erfahren), dann hätten Sie einen Fehler gefunden, glaube ich.

Dieser Code:

FunctionCall(GetFunction); 

sollte nicht kompilieren. Tatsächlich kompiliert es nicht, wenn ich versuche, es in XE3, XE4, XE5, XE6 und XE7 zu kompilieren. Es wird nicht kompiliert, da in diesem speziellen Zusammenhang der Compiler GetFunction als Typ

function: TFunc<Integer> 

Alle oben genannten Compiler mit dieser Fehlermeldung Objekt interpretiert:

 
[dcc32 Error] E2010 Incompatible types: 'System.SysUtils.TFunc' and 'Procedure' 

Also, wenn Sie irgendwie haben (vielleicht mit einigen Compiler-Optionen), geschafft, diesen Code kompilieren zu lassen, dann kann ich nur glauben, dass das auf einen Fehler zurückzuführen ist.

Sie sollten damit umgehen, indem Sie die Klammern anwenden, damit der Compiler verstehen kann, dass Sie GetFunction aufrufen möchten, sich nicht darauf beziehen.

FunctionCall(GetFunction()); 
+1

Ich kann bestätigen, dass es auch in XE4 nicht kompiliert. –

Verwandte Themen