Moin!
Bei der Verwendung von Generics unter Delphi 2009 bin ich kürzlich über folgende Fehlermeldung gestolpert:
Zitat:
[DCC Fataler Fehler] F2084 Interner Fehler: L2084
Daraufhin habe ich das Problem isoliert und mit möglichst minimalem Quellcode reproduziert. Das Projekt beinhaltet zwei Units:
Delphi-Quellcode:
unit testGenerics;
interface
uses
Controls;
type
TMyGenericClass<T> =
class
private
FIntegerArray:
Array of Integer;
// Array als Feldvariable einer generischen Klasse
public
constructor Create;
end;
implementation
{ TMyGenericClass<T> }
constructor TMyGenericClass<T>.Create;
begin
// do nothing
end;
end.
Delphi-Quellcode:
unit main;
interface
uses
testGenerics,
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs;
type
TMyDummieClass =
class
constructor Create;
end;
TForm1 =
class(TForm)
procedure FormCreate(Sender: TObject);
private
FMyGenericClass: TMyGenericClass<TMyDummieClass>;
public
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
{ TMyDummieClass }
constructor TMyDummieClass.Create;
begin
// do nothing
end;
{ TForm1 }
procedure TForm1.FormCreate(Sender: TObject);
begin
FMyGenericClass := TMyGenericClass<TMyDummieClass>.Create;
// verursacht die Fehlermeldung
end;
end.
Kann es sein dass Delphi ein Problem mit generischen Klassen hat, die Arrays als Feldvariablen haben? Wenn ich die Feldvariable entferne compiliert und läuft es fehlerfrei, ebenso wenn ich die generische Klasse zu einer nicht generischen mache. Hat jemand bereits Erfahrungen mit diesem Problem gesammelt? Compiliert das ganze unter Delphi 2010? Ein funktionierender Workaround ist folgende Variante:
Delphi-Quellcode:
type
TIntegerArray = Array of Integer;
TMyGenericClass<T> = class
private
FIntegerArray: TIntegerArray;
public
constructor Create;
end;
In besonderen Fällen kann man auch einen Wrapper um den Array basteln, andererseits wäre das ziemlich umständlich.