【发布时间】:2012-09-23 12:15:58
【问题描述】:
我正在尝试编写一个接受匹配参数类型的通用函数。
Delphi 确实在普通参数的简单情况下正确推断类型参数。
例如:
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');
【问题讨论】:
-
我认为错误消息给你一个线索,类型推断不会在这里完成工作。对于编译器的推理系统来说,这显然是比 Q 顶部的简单示例更难的问题。
-
尝试将 aVal:T 设为第一个参数,也许这样会更容易编译,但机会非常非常小
-
将“string”替换为“strign”,享受 E2010 不兼容的类型:'System.Generics.Collections.TList
' 和 'Boolean' -
用 nil 替换第一个参数,你会得到 E2532 Couldn't infer generic type argument from different arguments types for method 'Pair' // 这可能是正确的错误,其他都是假的。我认为您可以打开有关误导性错误消息的 QC 票
-
但是@Arioch,我们不知道来自第二个函数的消息是否真的具有误导性,因为我们还不了解编译器的问题。 first 函数的“无法推断泛型类型”错误无关紧要。对于第二个函数,编译器显然已经推断出类型(因为它没有抱怨它无法推断出它们),所以问题在于认识到推断出的类型与显式指定的类型相同——@ 987654327@ 等价于
System.String— 如果这确实是T被推断的那样。
标签: delphi generics delphi-xe type-inference