XE6 to XE7 Update 1 Generics incompatibility.
I can’t say for sure if I ever tried this in XE7 first version, but I don’t think I did.
procedure TAbstractBaseFactory.CreateInner;
begin
FInner := TBaseTypeClass(T).Create;
end;
TBaseTypeClass(T).Create; compiles and runs in XE6, but gives
[dcc32 Error] : E2010 Incompatible types: ‘T’ and ‘TAbstractBaseType’
in XE7.
Stefan Glienke – You showed me this trick for XE6 – any suggestions for XE7?
{code}
program CreateFromGenericTClassXE7;
{$APPTYPE CONSOLE}
{$R *.res}
uses
System.SysUtils;
type
TAbstractBaseType = class
public
Constructor Create; virtual;
procedure DoSomething; virtual; abstract;
end;
TDescendantType = class(TAbstractBaseType)
public
procedure DoSomething; override;
end;
type
TBaseTypeClass = class of TAbstractBaseType;
type
TAbstractBaseFactory = class abstract (TObject)
private
FInner: T;
procedure SetInner(const Value: T);
public
constructor Create;
procedure CreateInner; virtual;
property Inner: T read FInner write SetInner;
end;
{ TAbstractBaseFactory }
constructor TAbstractBaseFactory.Create;
begin
Inherited;
end;
procedure TAbstractBaseFactory.CreateInner;
begin
FInner := TBaseTypeClass(T).Create; // [dcc32 Error] : E2010 Incompatible types: ‘T’ and ‘TAbstractBaseType’
end;
procedure TAbstractBaseFactory.SetInner(const Value: T);
begin
FInner := Value;
end;
{ TDescendantType }
procedure TDescendantType.DoSomething;
begin
end;
{ TAbstractBaseType }
constructor TAbstractBaseType.Create;
begin
Inherited;
end;
begin
try
{ TODO -oUser -cConsole Main : Insert code here }
except
on E: Exception do
Writeln(E.ClassName, ‘: ‘, E.Message);
end;
end.
You must be logged in to post a comment.