Einzelnen Beitrag anzeigen

Dennis07

Registriert seit: 19. Sep 2011
Ort: Deutschland
482 Beiträge
 
Delphi 11 Alexandria
 
#6

AW: TArray<string> als const deklarieren

  Alt 5. Dez 2019, 15:04
Zitat:
[dcc32 Fehler] F.pas(263): E2086 Typ 'TArray<T>' ist nicht vollständig definiert
Das scheint wohl nicht so zu funktionieren. Nur ohne Record
Delphi-Quellcode:
type
 TRec = record
 const
  MyArray: TArray<String> = ['First','Second','Third'];
end;
Das ist ein Bug im Compiler, der nach wie vor verhindert, generische Arrays in Klassen oder Records zu verwenden.
Siehe hierzu RSP-21151. Wurde bisher nicht gefixt. Ob es zu den Bugs wird, die uns wohl für ewig erhalten bleiben werden, lässt sich nur vermuten. Es existiert seit es Generics gibt und wurde bereits vor fast anderthalb Jahren gemeldet.

Derzeit bleibt dir wohl nichts anderes übrig, als es entweder lokal in einer Methode, global in einer Unit, oder als normales statisches/dynamisches Array zu deklarieren.

Ich habe eine Funktion, die TArray<string> entgegennimmt. Und X als Parameter nimmt sie nicht, da es array of string ist.
Folglich müsste ich also den Funktionskopf zu array of string umschreiben. Kein Großes Problem, aber inkonsistent am Ende, wenn man nur noch TArray<string> verwendet.
Erstens kannst du beide auch inline mit ['value1', 'value2'] deklarieren.
Zweitens sind TArray<String> und array of String zuweisungskompatibel, bzw. explizit umwandelbar:

Delphi-Quellcode:
var
  a1: array of String;
  a2: TArray<String>;
begin
  a1 := a2; // Geht nicht
  a2 := a1; // Geht nicht
  TArray<String>(a1) := a2; // Geht
  a2 := TArray<String>(a1); // Geht
end;
Und, drittens, sind Parameter eines Array-Typs überhaupt keine echten "Array"-Parameter, sondern so genannte "offene Array-Parameter".
Deshalb kannst du ihnen eigentlich jeden Array-Typen, inklusive konstanter, statischer, TArray<T> , TMyArray und array of TMy übergeben, ohne dass der Compiler rummeckert. Innerhalb der Funktion werden sie dann (nicht wie TArray<T> -Parameter!) als Array-Objekte, sondern als Kopien dieser verwendet.
Das heißt, selbst, wenn du das Array-Objekt in der Funktion veränderst (zB. ein Element veränderst), bleibt das Ursprungsarray gleich.

Wenn du mehr über offene Arrays wissen willst, habe ich dazu einen ausführlichen Post vor einiger Zeit geschrieben. Du findest ihn hier.
Dennis
  Mit Zitat antworten Zitat