Delphi:引用参数的泛型类型推断

时间:2011-04-08 08:50:46

标签: delphi generics type-inference delphi-xe

解决参考参数的泛型类型推理的缺点的最佳方法是什么,以便我不必在每次调用中指定类型

更新:我不介意其他(包括非通用)解决方案,只要它适用于多种(任何?)类型。

这似乎仍然没有得到解决,虽然已经有一段时间了。

请在Embarcaderos Quality Central投票决定此问题:Issue #78103

commentBarry KellyGeneric Methods and Type Inferencing

  PS:你的例子,在Tiburon,几乎可以工作。方法类型推断适用于通过值传递的参数。不幸的是,它不适用于通过引用传递的参数(编译器过于严格)。

现在,差不多三年后,我在Delphi XE中尝试了同样的事情,它抱怨说:

  

[DCC错误] INIv1_Parser.pas(81):E2033实际和正式var参数的类型必须相同

致电:

function FindDataItemValue<T>(ItemType: TDataItemType; out Value: T): Boolean;

使用:

var MaxG: Real;
...
if Data.FindDataItemValue(PAR_MaxG, MaxG) and (MaxG = 2.5) then ...

通常建议的解决方法:但是,如果我在通话中添加概括,它可以正常工作虽然很烦人甚至需要它。

更新

到目前为止,我提出的最好的方法是使用Variants或Rtti模块中的TValue记录。使用变体我在需要使用对象时实现接口,并在变体中存储对该接口的引用。

3 个答案:

答案 0 :(得分:3)

类型推断当前不适用于var和out参数。我同意这很烦人。

答案 1 :(得分:1)

没有解决方法。您必须指定类型。

var
  MaxG: Real;
...
  if Data.FindDataItemValue<Real>(PAR_MaxG, MaxG) and (MaxG = 2.5) then ...

如果您希望Embarcadero解决此问题,请投票选择this QC entry that is about your issue

投票率最高的QC参赛作品受到更多关注。

答案 2 :(得分:0)

最好的方法是完全按照您引用的文章中的内容进行操作:在方法调用中包含类型参数:

if Data.FindDataItemValue<Real>(PAR_MaxG, MaxG) ...