AGB  ·  Datenschutz  ·  Impressum  







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

Generics ToArray: TArray vs. array of

Ein Thema von christophspaeth · begonnen am 6. Feb 2014 · letzter Beitrag vom 6. Feb 2014
Antwort Antwort
Seite 1 von 2  1 2      
christophspaeth

Registriert seit: 7. Mär 2008
73 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#1

Generics ToArray: TArray vs. array of

  Alt 6. Feb 2014, 09:12
Delphi-Version: XE2
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  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?
Christoph Späth
  Mit Zitat antworten Zitat
Benutzerbild von jaenicke
jaenicke

Registriert seit: 10. Jun 2003
Ort: Berlin
9.648 Beiträge
 
Delphi 11 Alexandria
 
#2

AW: Generics ToArray: TArray vs. array of

  Alt 6. Feb 2014, 09:16
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.
Sebastian Jänicke
AppCentral

Geändert von jaenicke ( 6. Feb 2014 um 09:18 Uhr)
  Mit Zitat antworten Zitat
Der schöne Günther

Registriert seit: 6. Mär 2013
6.176 Beiträge
 
Delphi 10 Seattle Enterprise
 
#3

AW: Generics ToArray: TArray vs. array of

  Alt 6. Feb 2014, 09:27
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 TProc als auch TThreadProcedure sind beide nur ein Alias für reference to procedure , aber er meinte trotzdem, beide Typen wären inkompatibel.
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.625 Beiträge
 
Delphi 12 Athens
 
#4

AW: Generics ToArray: TArray vs. array of

  Alt 6. Feb 2014, 09:44
Hilft das hier zum Verständnis? http://docwiki.embarcadero.com/RADSt...Typdeklaration
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Der schöne Günther

Registriert seit: 6. Mär 2013
6.176 Beiträge
 
Delphi 10 Seattle Enterprise
 
#5

AW: Generics ToArray: TArray vs. array of

  Alt 6. Feb 2014, 09:54
Nein. Da steht ja nur
  • Alias: type TMeinAlias = TMeinTyp
  • Neuer, inkompatibler Typ: type TMeinNeuerTyp = type TMeinTyp

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?
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.625 Beiträge
 
Delphi 12 Athens
 
#6

AW: Generics ToArray: TArray vs. array of

  Alt 6. Feb 2014, 10:00
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.
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
christophspaeth

Registriert seit: 7. Mär 2008
73 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#7

AW: Generics ToArray: TArray vs. array of

  Alt 6. Feb 2014, 10:03
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 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?
Christoph Späth
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.625 Beiträge
 
Delphi 12 Athens
 
#8

AW: Generics ToArray: TArray vs. array of

  Alt 6. Feb 2014, 10:15
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.
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
christophspaeth

Registriert seit: 7. Mär 2008
73 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#9

AW: Generics ToArray: TArray vs. array of

  Alt 6. Feb 2014, 10:27
TArray ist in der System.pas aber als   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.
Christoph Späth
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.625 Beiträge
 
Delphi 12 Athens
 
#10

AW: Generics ToArray: TArray vs. array of

  Alt 6. Feb 2014, 10:49
Ich hatte hier nachgesehen, und danach ist es eine Klasse, allerdings in einer anderen Unit (Generics.Collections).
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


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:26 Uhr.
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