Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Generics ToArray: TArray vs. array of (https://www.delphipraxis.net/178970-generics-toarray-tarray-vs-array.html)

christophspaeth 6. Feb 2014 08:12

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:
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;
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.
In der System ist aber
Delphi-Quellcode:
 TArray<T> = array of T
, also auch wieder array of TMyType definiert.

Jetzt stehe ich glaube ich etwas auf dem Schlauch: Das sind doch beides dynamische Arrays?

Generics über SOAP macht ja zum einen Probleme (http://www.delphipraxis.net/150579-g...eber-soap.html), zum anderen hab ch mal gelernt, dass nur generische Typen oder TRemotable-Kinder verwendet werden sollen/dürfen.

Gibt es hier eine schönere/elegantere Lösung als das Ergebnis manuell mit Setlength und for-Schleife zu befüllen?

jaenicke 6. Feb 2014 08:16

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.

Der schöne Günther 6. Feb 2014 08:27

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:
TProc
als auch
Delphi-Quellcode:
TThreadProcedure
sind beide nur ein Alias für
Delphi-Quellcode:
reference to procedure
, aber er meinte trotzdem, beide Typen wären inkompatibel.

DeddyH 6. Feb 2014 08:44

AW: Generics ToArray: TArray vs. array of
 
Hilft das hier zum Verständnis? http://docwiki.embarcadero.com/RADSt...Typdeklaration

Der schöne Günther 6. Feb 2014 08:54

AW: Generics ToArray: TArray vs. array of
 
Nein. Da steht ja nur
  • Alias:
    Delphi-Quellcode:
    type TMeinAlias = TMeinTyp
  • Neuer, inkompatibler Typ:
    Delphi-Quellcode:
    type TMeinNeuerTyp = type TMeinTyp

Delphi-Quellcode:
TCaption
ist ja beispielsweise (unsinnigerweise, IMO) ein neuer Typ (entgegen der Doku). Allerdings wird der trotzdem ohne Murren implizit von und nach String gecasatet.

Ich habe die Logik dahinter nie durchblickt. Geht es nur für PODs und meinetwegen Strings?

DeddyH 6. Feb 2014 09:00

AW: Generics ToArray: TArray vs. array of
 
Delphi-Quellcode:
type
  TIntArray1 = array of integer;
  TIntArray2 = array of integer;
Damit deklariert man 2 Typen mit jeweils eigenen Typinformationen.
Delphi-Quellcode:
type
  TIntArray1 = array of integer;
  TIntArray2 = type TIntArray1;
dto.
Delphi-Quellcode:
type
  TIntArray1 = array of integer;
  TIntArray2 = TIntArray1;
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.

christophspaeth 6. Feb 2014 09:03

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:
array of TMyType
sein.

DeddyH: Das heißt, dass ein type auf ein array of eben mehr als nur ein im Artikel beschriebenr Alias ist?

DeddyH 6. Feb 2014 09:15

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.

christophspaeth 6. Feb 2014 09:27

AW: Generics ToArray: TArray vs. array of
 
TArray ist in der System.pas aber als
Delphi-Quellcode:
  TArray<T> = array of T;
definiert, also eben gerade keine Klasse.

Du hattest ja geschriben, dass
Delphi-Quellcode:
type
  TIntArray1 = array of integer;
  TIntArray2 = array of integer;
zwei verschiedene, neue (und damit "inkompatible") Typen definiert (was ich in dem von dir verlinkten Artikel aber eben nicht herauslesen kann), wohingegen
Delphi-Quellcode:
type
  TInt1 = integer;
  TInt2 = integer;
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.

DeddyH 6. Feb 2014 09:49

AW: Generics ToArray: TArray vs. array of
 
Ich hatte hier nachgesehen, und danach ist es eine Klasse, allerdings in einer anderen Unit (Generics.Collections).


Alle Zeitangaben in WEZ +1. Es ist jetzt 20:02 Uhr.
Seite 1 von 2  1 2      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz