delphi – 通用方法类型推断

delphi – 通用方法类型推断,第1张

概述假设我有一个包含两个泛型方法的类: TMyClass = class procedure DoWith<T: class> (obj: T); procedure DoFor<T: class> ( proc: TProc<T> );end; 现在,当我想用​​特定的类型参数调用这两个方法中的任何一个时,Delphi可以推断出DoWith方法的类型,所以我可以用它们调用它 MyClass 假设我有一个包含两个泛型方法的类:

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);  // compilesMyClass.DoFor(procedure (button: Tbutton) begin .... end);  // doesn't compile

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

解决方法 它不能从TProc< T>论证推断T的原因是那时TProc< Tbutton>是没有任何信息的构造类型,它最初是TProc< T>.

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

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

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

总结

以上是内存溢出为你收集整理的delphi – 通用方法类型推断全部内容,希望文章能够帮你解决delphi – 通用方法类型推断所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/langs/1261292.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-06-08
下一篇2022-06-08

发表评论

登录后才能评论

评论列表(0条)

    保存