Tôi bắt đầu dự án trên Delphi 2010, sau đó di chuyển sang XE và bây giờ tôi cố gắng di chuyển sang XE2. Sau khi biên dịch trong XE2 (Update 4 Hotfix 1), kiểm tra đơn vị đã bắt đầu thất bại với AV. Sau khi một số lỗi, nó trở nên rõ ràng rằng đoạn mã sau không được biên dịch một cách chính xác: kết quả đầu raLỗi trình biên dịch khi sử dụng generics và khai báo chuyển tiếp trong Delphi XE2
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.
Chương trình:
TEntityBase: 12 bytes
TMyEntity1: 12 bytes <-- Must be 16 bytes!
EAssertionFailed: Assertion failure (ForwardDeclaration.dpr, line 41)
Có thể giải quyết vấn đề bằng cách lựa chọn điều chỉnh biên dịch?
Sự cố này có lặp lại với người khác không?
P.S. QC107110
Gửi thư này đến QualityCentral. Ngoài ra, nơi nào các tờ khai chuyển tiếp đi vào nó. Khai báo duy nhất như vậy không được sử dụng. –
Mã được đơn giản hóa nhất, do đó lỗi trình biên dịch được sao chép. Trong một dự án thực sự, các khai báo chuyển tiếp được sử dụng. Nếu vấn đề này không chỉ với tôi, thì tôi viết thư cho QC. – Chaa
OK. Khi bạn gửi lỗi, bạn nên xóa nó đi sâu hơn nữa. Có vẻ như tuyên bố về phía trước không liên quan. Chỉ đơn giản là một vấn đề codegen với InstanceSize. Nếu bạn có hợp đồng hỗ trợ, bạn có thể mở một vấn đề hỗ trợ mặc dù thậm chí làm điều đó không nhất thiết có nghĩa là bạn sẽ nhận được phản hồi. –