Einzelnen Beitrag anzeigen

stimpinski

Registriert seit: 5. Mai 2009
3 Beiträge
 
#1

(D2009) Generics mit Array als Feldvariable: Interner Fehler

  Alt 7. Apr 2010, 16:10
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.
  Mit Zitat antworten Zitat