2014-09-09 20 views
6

tôi có hàm trả về hàm TFunc<Integer>reference to function:Integer. và tôi có một thủ tục nhận hàm TFunc<Integer> làm đối số, gọi nó và in kết quả của nó."tham chiếu đến hàm" là kết quả của hàm

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. 

cuộc gọi này (FunctionCall(GetFunction);) dẫn đến lỗi. và cuộc gọi với () hoạt động như bị xem thường.

câu hỏi của tôi là:
khi trong delphi để tôi cần giá treo đồ để gọi một hàm và khi không (tôi nghĩ rằng tôi không bao giờ cần đến chúng)
hoặc
tôi không cần họ và nó là một lỗi?

tôi làm việc với delphi xe5 trên windows 7 dcc32.

Trả lời

4

Nếu những gì bạn báo cáo là chính xác (và xem bên dưới để biết thêm về điều đó), thì bạn sẽ tìm thấy một lỗi, tôi tin.

Mã này:

FunctionCall(GetFunction); 

không nên biên dịch. Thật vậy nó không biên dịch khi tôi cố gắng biên dịch nó trong XE3, XE4, XE5, XE6 và XE7. Nó không biên dịch bởi vì, trong bối cảnh đặc biệt này, trình biên dịch dịch GetFunction như là kiểu

function: TFunc<Integer> 

trình biên dịch Tất cả các nêu trên đối tượng với thông báo lỗi này:

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

Vì vậy, nếu bạn có bằng cách nào đó (có lẽ với một số tùy chọn trình biên dịch), quản lý để làm cho mã biên dịch sau đó tôi chỉ có thể tin rằng đó là do một lỗi.

Bạn nên giải quyết vấn đề này bằng cách áp dụng dấu ngoặc đơn để trình biên dịch có thể hiểu rằng bạn muốn gọi GetFunction, không tham chiếu đến nó.

FunctionCall(GetFunction()); 
+1

Tôi có thể xác nhận nó cũng không biên dịch trong XE4. –

Các vấn đề liên quan