AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

TArray<string> als const im Record deklarieren

Ein Thema von DieDolly · begonnen am 5. Dez 2019 · letzter Beitrag vom 15. Dez 2019
 
Dennis07

Registriert seit: 19. Sep 2011
Ort: Deutschland
491 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
 


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:23 Uhr.
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz