2012-10-02 152 views
7

我想寫一個接受匹配參數類型的泛型函數。
德爾福確實在簡單的參數的簡單情況下正確推斷類型參數。基於泛型參數類型的類型推斷(德爾福)

如:

type 
    TFoo = class 
    function Pair<T>(e1, e2: T): TList<T>; 
    end; 

aFoo.Pair(1, 2);工作完全正常調用這個,但是當我改變參數簽名泛型類型

type 
    TFoo = class 
    function InsertInto<T>(aList: TList<T>; aVal: T): TList<T>; 
    end; 

,並試圖把它
aFoo.InsertInto(TList<String>.Create, 'bar');

然後編譯器就會抱怨它:
E2010 Incompatible types: 'Generics.Collections.TList<uTest.TFoo.InsertInto.T>' and 'Generics.Collections.TList<System.String>'

有什麼辦法可以寫這個(或類似的)方法,以便客戶端不必指定類型參數?
aFoo.InsertInto<String>(TList<String>.Create, 'bar');

+0

我認爲這個錯誤信息給你一個線索,即類型推斷不會在這裏完成工作。這顯然是對編譯器的推理系統不是在問: –

+0

嘗試的頂部,使AVAL簡單的例子一個困難的問題:T第一個參數,也許這將使其更易於編譯器,但機會是非常非常差 –

+0

替換「字符串「與‘strign’,享受E2010不兼容的類型:‘System.Generics.Collections.TList ’和‘布爾’ –

回答

5

我的猜測是來自Delphi的強類型本質。
uTest.TFoo.InsertInto.T相當於System.String但它實際上不同類型

就像在本實施例中,其中Int1Int2是相同類型的不:

var 
    Int1: array[1..10] of Integer; 
    Int2: array[1..10] of Integer; 
     ... 
    Int1 := Int2; // <== BOOM! E2008 Incompatible types (in XE2) 

實際問題不類型推斷但與類型不是每帕斯卡/ Delphi的嚴格規則兼容。

+1

這聽起來很合理。一個小挑剔。你說的是類型標識和兼容性,而不是強/弱類型系統。 –

+2

也可能是字符串文字「bar」的類型不是「System.String」 - 至少還沒有。字符串文字的類型相當流暢;至少當它知道它需要什麼類型時,編譯器會指定它需要的任何類型。考慮如何將相同的字符串文字作爲UnicodeChar,PAnsiChar,WideString或ShortString傳遞,全部來自代碼中的相同文本。所以可能是'uTest.TFoo.InsertInto.T'實際上代表了六種不同的類型,編譯器無法選擇「最好」的。 –

+0

它也不適用於Integer文字,儘管這可能有類似的原因(Byte vs. Integer vs. Cardinal)。 –