加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

delphi – 通用方法类型推断

发布时间:2020-12-15 09:28:43 所属栏目:大数据 来源:网络整理
导读:假设我有一个包含两个泛型方法的类: TMyClass = class procedure DoWithT: class (obj: T); procedure DoForT: class ( proc: TProcT );end; 现在,当我想用??特定的类型参数调用这两个方法中的任何一个时,Delphi可以推断出DoWith方法的类型,所以我可以用它
假设我有一个包含两个泛型方法的类:

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

现在我的问题是:这只是编译器的一个缺点,还是有任何逻辑上的原因(我还没想到)禁止编译器正确推断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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读