![]() |
Delphi-Version: XE2
Generics ToArray: TArray vs. array of
Hallo,
in einer Klasse möchte ich Unterobjekte zwar in einer generischen Liste verwalten, über die published Schnittstelle (für Übertragung via SOAP) aber auch als array of (bzw. einen eigens definierten Typ) anbieten:
Delphi-Quellcode:
Wenn ich jetzt in der Funktion GetData versuche, FData.ToArray() zurückzugeben, meckert der Compiler, dass die Typen TMyTypes und System.TArray<TMyType> inkompatibel seien.
type
TMyType = class(TRemotable) //irgendwas end; TMyTypes = array of TMyType; TParentType = class(TRemotable) private FData: TList<TMyType>; public property Data: TList<TMyType> read FData; published property DataTransfer: TMyTypes read GetData write SetData; end; In der System ist aber
Delphi-Quellcode:
, also auch wieder array of TMyType definiert.
TArray<T> = array of T
Jetzt stehe ich glaube ich etwas auf dem Schlauch: Das sind doch beides dynamische Arrays? Generics über SOAP macht ja zum einen Probleme ( ![]() Gibt es hier eine schönere/elegantere Lösung als das Ergebnis manuell mit Setlength und for-Schleife zu befüllen? |
AW: Generics ToArray: TArray vs. array of
Ich würde immer TArray<TMyType> verwenden statt des eigenen Typs oder TMyTypes als TArray<T> deklarieren (letzteres sollte doch auch via SOAP gehen, oder?). Ansonsten geht das nicht direkt zuzuweisen (ohne Tricks jedenfalls).
// EDIT: Allerdings macht ToArray ja auch nix anderes als das manuell zu holen, insofern könntest du dir dafür auch einen Ersatz schreiben, dann brauchst du das Ergebnis von ToArray nicht noch einmal umkopieren. |
AW: Generics ToArray: TArray vs. array of
Aber woran liegt das eigentlich- Nach welchem Muster merkt der Compiler eigentlich nicht, dass es doch ein- und dieselben Typen sind? Den gleichen Fall hatte ich gestern auch: Sowohl
Delphi-Quellcode:
als auch
TProc
Delphi-Quellcode:
sind beide nur ein Alias für
TThreadProcedure
Delphi-Quellcode:
, aber er meinte trotzdem, beide Typen wären inkompatibel.
reference to procedure
|
AW: Generics ToArray: TArray vs. array of
Hilft das hier zum Verständnis?
![]() |
AW: Generics ToArray: TArray vs. array of
Nein. Da steht ja nur
Delphi-Quellcode:
ist ja beispielsweise (unsinnigerweise, IMO) ein neuer Typ (entgegen der Doku). Allerdings wird der trotzdem ohne Murren implizit von und nach String gecasatet.
TCaption
Ich habe die Logik dahinter nie durchblickt. Geht es nur für PODs und meinetwegen Strings? |
AW: Generics ToArray: TArray vs. array of
Delphi-Quellcode:
Damit deklariert man 2 Typen mit jeweils eigenen Typinformationen.
type
TIntArray1 = array of integer; TIntArray2 = array of integer;
Delphi-Quellcode:
dto.
type
TIntArray1 = array of integer; TIntArray2 = type TIntArray1;
Delphi-Quellcode:
Hier ist TIntArray2 lediglich ein Typalias, es werden keine eigenen Typinformationen generiert. Variante 2 bietet noch die Möglichkeit, Konstanten- oder Wertparameter beider Typen kompatibel zu behandeln, Variante 1 aber nicht, da es sich um 2 völlig voneinander unabhängige Typen handelt, auch wenn diese inhaltlich identisch sind.
type
TIntArray1 = array of integer; TIntArray2 = TIntArray1; |
AW: Generics ToArray: TArray vs. array of
Hallo,
danke für die Antworten. Wenn ich anstelle von einem eigenen Typen mit TArray<> arbeite compiliert es zumindest. Ob das ganze dann (sauber) über SOAP übertragen wird konnte ich noch nicht ausprobieren. Falls nicht gehe ich halt wieder auf meinen eigenen Typ zurück und verändere die Getter entsprechend. Zum Verständnis trägt der Artikel auch bei mir nur begrenzt bei - nach dem Artikel müssten ja beide Schreibweisen gleichwertige Aliase für
Delphi-Quellcode:
sein.
array of TMyType
DeddyH: Das heißt, dass ein type auf ein array of eben mehr als nur ein im Artikel beschriebenr Alias ist? |
AW: Generics ToArray: TArray vs. array of
Ein Alias ist es dann, wenn Du einfach nur einen bereits bestehenden Typ zuweist (siehe Variante 3 oben). Dein Problem ist, dass Du ToArray von TList verwenden willst, dieses ein TArray (eine Klasse) zurückgibt, Du aber einfach nur ein dynamisches Array deklariert hast. Und das kann logischerweise nicht funktionieren.
|
AW: Generics ToArray: TArray vs. array of
TArray ist in der System.pas aber als
Delphi-Quellcode:
definiert, also eben gerade keine Klasse.
TArray<T> = array of T;
Du hattest ja geschriben, dass
Delphi-Quellcode:
zwei verschiedene, neue (und damit "inkompatible") Typen definiert (was ich in dem von dir verlinkten Artikel aber eben nicht herauslesen kann), wohingegen
type
TIntArray1 = array of integer; TIntArray2 = array of integer;
Delphi-Quellcode:
lediglich zwei gleichbedutende Aliase für Integer erstellt. Wenn man weiß, dass es hier einen Unterschied in der Bedeutung der Typ- bzw. Aliasdeklaration gibt ist das Verhalten verständlich. Danke.
type
TInt1 = integer; TInt2 = integer; |
AW: Generics ToArray: TArray vs. array of
Ich hatte
![]() |
Alle Zeitangaben in WEZ +1. Es ist jetzt 08:02 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