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.