在Delphi XE2中使用generics和前向声明时的编译器错误
我开始Delphi 2010项目,然后迁移到XE,现在我尝试迁移到XE2。 在XE2(更新4修补程序1)编译后,unit testing开始与AV失败。 经过一些debugging,很明显,下面的代码没有正确编译:
program ForwardDeclaration; {$APPTYPE CONSOLE} uses System.SysUtils; type TEntityBase = class(TObject) protected FModel: Integer; public constructor Create(const AModel: Integer); end; TEntity<TKey> = class(TEntityBase) end; TMyEntity2 = class; TMyEntity1 = class(TEntity<Integer>) FData: Integer; end; TMyEntity2 = class(TMyEntity1) end; constructor TEntityBase.Create(const AModel: Integer); begin inherited Create; FModel := AModel; end; var MyEntity: TMyEntity1; begin try Writeln(TEntityBase.ClassName, ': ', TEntityBase.InstanceSize, ' bytes'); Writeln(TMyEntity1.ClassName, ': ', TMyEntity1.InstanceSize, ' bytes'); MyEntity := TMyEntity1.Create(100); Assert(MyEntity.FData = 0); except on E: Exception do Writeln(E.ClassName, ': ', E.Message); end; end.
scheme产出:
TEntityBase: 12 bytes TMyEntity1: 12 bytes <-- Must be 16 bytes! EAssertionFailed: Assertion failure (ForwardDeclaration.dpr, line 41)
是否有可能通过调整编译器选项来解决问题?
这个问题是否重复在别人身上?
PS QC107110
是否有可能通过调整编译器选项来解决问题?
不 ,你不能通过调整来修复错误,这是编译器中的(非常具体的)错误。
[有人可以告诉我]这个问题是否重复在别人身上?
我可以重现的代码,但只有在XE2更新4。
我无法在XE3中检查它(没有该版本)。 这是固定在XE4(根据评论)。
所以使代码工作的唯一方法是:
一个。 删除不需要的前向声明。
湾 使用不同版本的Delphi。