假设我有一个具有两个通用方法的类:
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
方法中省略类型参数,Delphi 编译器会提示缺少类型参数:
MyClass.DoFor<TButton>(procedure (Button: TButton) begin .... end); // compiles
MyClass.DoFor(procedure (Button: TButton) begin .... end); // doesn't compile
现在我的问题是:这只是编译器的一个缺点,还是有任何逻辑原因(我还没有弄清楚)阻止编译器正确推断 DoFor
方法?
最佳答案
它无法推断的原因 T
来自TProc<T>
说法是当时TProc<TButton>
是一个构造类型,没有任何信息表明它最初是 TProc<T>
.
要做到这一点,它必须从匿名方法签名中推断类型,这是行不通的(我想 Barry Kelly 可以更好地解释这一点,我认为他曾经写过关于 Delphi 中 lambda 和类型推断的困难)。
Delphi 编译器能够进行的唯一类型推断是类型 T 的参数。即使有多个参数,这种情况也不会经常起作用,如果您有多个泛型类型参数,则效果更差。
编辑:我发现了一条评论,其中 Barry 解释了一些有关 Delphi 编译器中类型推断和 lambda 的困难:http://www.deltics.co.nz/blog/posts/244/comment-page-1#comment-107
关于delphi - 泛型方法类型推断,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27274137/