通用方法类型推断

时间:2014-12-03 14:25:12

标签: delphi generics type-inference

我们说我有一个有两种通用方法的类:

TMyClass = class
  procedure DoWith<T: class> (obj: T);
  procedure DoFor<T: class> ( proc: TProc<T> );
end;

现在,当我想用​​特定的类型参数调用这两个方法中的任何一个时,Delphi可以推断DoWith方法的类型,所以我可以用

来调用它
MyClass.DoWith <TButton> ( MyButton )

MyClass.DoWith ( MyButton )

Delphi编译器很乐意编译它们。 但是如果我在DoFor方法中省略了type参数,那么Delphi编译器会抱怨丢失的类型参数:

MyClass.DoFor<TButton>(procedure (Button: TButton) begin .... end);  // compiles


MyClass.DoFor(procedure (Button: TButton) begin .... end);  // doesn't compile

现在我的问题是:这只是编译器的一个缺点,还是有任何逻辑上的原因(我还没想到)禁止编译器正确推断{{1}的类型方法?

1 个答案:

答案 0 :(得分:5)

它无法从T参数推断TProc<T>的原因是,TProc<TButton>是一个构造类型,没有任何信息,它最初是TProc<T>。< / p>

要做到这一点,它必须从匿名方法签名中推断出不起作用的类型(我猜Barry Kelly可以更好地解释这一点,我认为他曾经写过关于lambdas的困难和Delphi中的类型推断)。 / p>

Delphi编译器能够进行的唯一类型推断是类型为T的参数。即使有多个参数不经常工作,如果你有多个泛型类型参数也会更少。

编辑:我发现了一条评论,Barry在Delphi编译器中解释了类型推断和lambdas的困难:http://www.deltics.co.nz/blog/posts/244/comment-page-1#comment-107