delphi - 泛型方法类型推断

标签 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 方法中省略类型参数,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/

相关文章:

type-inference - 为什么我不能定义以下 CoFixpoint?

在 match 语句中未正确推断 Scala 类型边界

delphi - 如何防止其他进程终止我的服务?

c++ - 模板函数以外的 OCaml 多态性示例?

C++ 限制泛型中的类型(和指针问题)

c# - 如何在 C# 中使用泛型声明变量

delphi - 在Delphi的TWebbrowser中保存特定图像?

delphi - 如何防止控件被添加到从TCustomPanel派生的组件中?

delphi - 没有找到rtl100.bpl?

F# 在 If/Then 中推断类型