2012-07-13 33 views
45

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

+0

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. –

+0

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

+0

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. –

Trả lời

4

Có thể giải quyết vấn đề bằng cách lựa chọn điều chỉnh biên dịch?

Không, bạn không thể sửa chữa các lỗi bằng cách điều chỉnh, đó là một (rất cụ thể) lỗi trong trình biên dịch.

[Ai đó có thể cho tôi biết] Sự cố này có lặp lại với người khác không?

tôi có thể tái tạo các mã, nhưng chỉ trong XE2 cập nhật 4.

tôi đã không thể kiểm tra xem nó trong XE3 (không có phiên bản đó). Nó được cố định trong XE4 (theo nhận xét).

Vì vậy, cách duy nhất để mã hoạt động là:

a. xóa tờ khai chuyển tiếp không cần thiết.
b. sử dụng phiên bản Delphi khác.

Các vấn đề liên quan