full - delphi berlin
Error del compilador al usar genéricos y declaración directa en Delphi XE2 (1)
¿Es posible resolver el problema ajustando las opciones del compilador?
No , no puedes arreglar el error ajustando, es un error (muy específico) en el compilador.
[¿Puede alguien decirme] si este problema se repite en otra persona?
Puedo reproducir el código, pero solo en la actualización XE2 4.
No pude verificarlo en XE3 (no tengo esa versión). Se arregla en XE4 (según los comentarios).
Entonces, la única forma de que el código funcione es:
a. eliminar la declaración adelante innecesaria.
segundo. usa una versión diferente de Delphi.
Comencé proyecto en Delphi 2010, luego migré a XE y ahora trato de migrar a XE2. Después de compilar en XE2 (Actualización 4 Hotfix 1), las pruebas unitarias comenzaron a fallar con AV. Después de algunas depuraciones, quedó claro que el siguiente código no se compiló correctamente:
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.
Resultados del programa:
TEntityBase: 12 bytes
TMyEntity1: 12 bytes <-- Must be 16 bytes!
EAssertionFailed: Assertion failure (ForwardDeclaration.dpr, line 41)
¿Es posible resolver el problema ajustando las opciones del compilador?
Si este problema se repite en otra persona?
PS QC107110