2012-12-20 54 views
4

我遇到了仿製藥的問題。我不知道如何將OnCallbackWrapper傳遞給CallbackWrapper程序。我收到以下例子「不兼容的類型」錯誤:爲什麼編譯器會爲我的泛型函數參數抱怨「不兼容的類型」?

unit uTest; 

interface 

uses 
    Generics.Defaults; 

type 
    TGenericCallback<T> = procedure(Fields: T); 

type 
    TSpecificFields = record 
    A: Integer; 
    B: Integer; 
    C: Integer; 
    end; 

const 
    SpecificFields: TSpecificFields = 
    (A: 5; B: 4; C: 3); 

procedure CallbackWrapper(GenericCallback: TGenericCallback<TSpecificFields>); 

implementation 

procedure CallbackWrapper(GenericCallback: TGenericCallback<TSpecificFields>); 
begin 
    GenericCallback(SpecificFields); 
end; 

procedure OnCallbackWrapper(const Fields: TSpecificFields); 
begin 
    Assert(Fields.A = 5); 
    Assert(Fields.B = 4); 
    Assert(Fields.C = 3); 
end; 

procedure Dummy; 
begin 
    CallbackWrapper(OnCallbackWrapper); //Incompatible types here 
end; 

end. 

我在做什麼錯?謝謝。由值

回答

7
procedure OnCallbackWrapper(Fields: TSpecificFields); 
begin 
    Assert(Fields.A = 5); 
    Assert(Fields.B = 4); 
    Assert(Fields.C = 3); 
end; 

或改變聲明

TGenericCallback<T> = procedure(const Fields: T); 

一個過程傳遞參數是不分配與通過引用傳遞參數的過程兼容。 Reference

+1

如果它解釋了爲什麼需要進行這些更改,我會投這個票。順便說一句,我明白用英語寫解釋可能對你並不容易,但我更喜歡任何解釋,不管英語多麼糟糕,完全沒有解釋。並且:你練習的越多,得到的就越好:-) –

+0

除了我的英語問題 ,我覺得這是膨脹的明顯的事情要詳細解釋。 這是一個相當默默無聞的人的個人問題。我會盡量適應,但它不適合我的個性。 – bummi

+1

我可以與此相關。如果可以的話,那會很好。請注意,我狡猾地期待着漫長的討論。只是一些幫助人們理解你的答案的提示(這很有用)。例如,以這個答案爲例,沒有解釋強迫人們尋找差異。你做的編輯確實有幫助!另外:不要害怕犯英文錯誤。很多人願意並能夠編輯你的答案,使英語更好。 –

8

您聲明的類型通過值接收其參數。

TGenericCallback<T> = procedure(Fields: T); // no const 

傳遞函數標有const

procedure OnCallbackWrapper(const Fields: TSpecificFields); // const parameter 

因此,編譯器會拒絕您嘗試傳遞的參數不匹配。你需要讓雙方都相配。例如:

TGenericCallback<T> = procedure(const Fields: T); 
+0

你們很快:)我知道我忽略了一些東西。這兩個答案都對大衛有幫助,所以+1,因爲他是第一個,所以他回答了bummi。 – Wodzu

+1

你應該接受最好的答案。如果你認爲它有幫助,你也應該讚揚bummi。不要害羞。但最重要的是,不僅僅是誰最快。注意我並不是說我的答案就是你應該接受的答案。我已經多次說過了。接受最好的答案。如果有人有更好的答案。接受。 –

+0

感謝您的評論。正在考慮你的答案的質量。問題是,對我來說,bummi的代碼足以瞭解我犯了什麼錯誤。 – Wodzu

相關問題