我们说我有一个有两种通用方法的类:
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}的类型方法?
答案 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