【发布时间】:2016-04-09 05:33:18
【问题描述】:
我在 Delphi XE8 中有以下类的声明:
TestClass = class;
TestClass = class
function test<T: TestClass>(supplier: TFunc<T>): T; // Compiler error
end;
这会引发以下编译器错误:
E2086 Type 'TestClass' is not yet completely defined
当我添加另一个类并将其用作约束时,它可以正常工作:
AnotherTestClass = class
end;
TestClass = class;
TestClass = class
function test<T: AnotherTestClass>(supplier: TFunc<T>): T; // No Error
end;
我怀疑问题是前向类型声明还没有告诉 Delphi 关于TestClass 类型的足够信息。这可能更明显,因为以下解决该问题的尝试会在不同的行上引发完全相同的编译器错误:
TestClass = class;
AnotherTestClass = class (TestClass) // Compiler Error
end;
TestClass = class
function test<T: AnotherTestClass>(supplier: TFunc<T>): T;
end;
我做错了什么,如果没有,有没有办法解决这个问题?
【问题讨论】:
-
看来这是编译器的bug所以我提交了bug report here。
-
当然是代码“TestClass = class;AnotherTestClass = class (TestClass) //编译器错误结束;”应该会产生所示的错误,因为 Delphi 是单通道编译器。但我看不出为什么同样适用于您尝试创建的构造。当时有足够的信息使定义有效。
-
@Dsm 同意,但由于编译器错误是相同的,我认为这是出问题的提示。但是这确实带来了一个问题,如果我想要两个互相使用作为类型参数约束的类怎么办?
-
我认为同样的问题适用于您的两个类,它们相互使用作为类型参数约束。显然这两个类需要在相同的单元和相同的类型块中,就像类相互引用一样,但我想你会遇到同样的问题。就像你的例子一样,我认为编译器没有理由不允许它。
标签: delphi generics forward-declaration delphi-xe8 type-constraints