2014-09-09 16 views
6

Ho una funzione che restituisce una funzione TFunc<Integer> che è reference to function:Integer. e ho una procedura che accetta come argomento una funzione TFunc<Integer>, la chiama e ne stampa il risultato."riferimento alla funzione" come risultato di una funzione

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. 

questa chiamata (FunctionCall(GetFunction);) restituisce un errore. e la chiamata con () funziona come previsto.

la mia domanda è:
quando in Delphi ho bisogno parentesi di chiamare una funzione e quando non (ho pensato che non ho mai bisogno di loro)
o
non dovrebbe ho bisogno di loro ed è un bug?

lavoro con delphi xe5 su windows 7 dcc32.

risposta

4

Se ciò che riporta è corretto (e vedi sotto per ulteriori informazioni su questo), allora avresti trovato un bug, credo.

Questo codice:

FunctionCall(GetFunction); 

non dovrebbe compilare. Infatti non si compila quando provo a compilarlo in XE3, XE4, XE5, XE6 e XE7. Esso non viene compilato perché, in questo particolare contesto, il compilatore interpreta GetFunction come di tipo

function: TFunc<Integer> 

compilatori Tutto di cui sopra oggetto con questo messaggio di errore:

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

Quindi, se avete in qualche modo (forse con alcune opzioni del compilatore), è riuscito a far compilare quel codice, quindi posso solo credere che sia dovuto a un bug.

Si dovrebbe affrontare questo problema applicando le parentesi in modo che il compilatore possa capire che si desidera chiamare GetFunction, non fare riferimento ad esso.

FunctionCall(GetFunction()); 
+1

Posso confermare che non si compila neanche in XE4. –