2012-10-02 61 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)。 –