Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Falscher Aufruf des überladenen Operators Explicit (https://www.delphipraxis.net/160892-falscher-aufruf-des-ueberladenen-operators-explicit.html)

s.h.a.r.k 6. Jun 2011 16:08

Falscher Aufruf des überladenen Operators Explicit
 
Hier mal schnell der Code, über den ich im Folgenden reden werde :stupid:
Delphi-Quellcode:
// Auszug aus der Definition von TMyClass
private type
  TGenericArray = TArray<T>;
  PGenericArray = ^TGenericArray;
public
  class operator Explicit(Value: TArray<T>): TApArray<T>;    {1}
  class operator Explicit(Value: PGenericArray): TApArray<T>; {2}
  //class operator Explicit(Value: Pointer): TApArray<T>;    {3}
end;


// Generischer Aufruf von Klasse TBlub
procedure TBlub.Test<T>(A: TArray<T>);
begin
  TMyClass<T>(@A).Sort();
end;
Ich habe den Fall, das ich eine generische Methode habe, die ein generisches Array übergeben bekommt -- nicht all zu selten in meiner Anwendung. Dieses Array will ich über ein entsprechend definierten Record sortieren, was an sich auch eigentlich immer wunderbar funktioniert, außer in diesem Fall. Ich will daran auch defintiv nichts ändern, sondern nur über das Problem an sich sprechen, welches hier auftritt.

Das Problem ist, dass Delphi beim Aufruf von
Delphi-Quellcode:
TMyClass<T>(@A)
nicht den zweiten Explicit-Operator mit dem PGenericArray-Parameter aufruft, sondern den ersten, was ziemlich falsch ist. Ich denke, dass das Problem hier definitiv am Compiler liegt, der sich an den Generics eben aufhängt, habe dies bzgl. aber leider keinerlei Erfahrung. Gebe ich eine konkreten Typ an, z.B.
Delphi-Quellcode:
TMyClass<String>(@A).Sort();
, dann wird korrekterweise der zweite Explicit-Operator aufgerufen.

Interessant wird es aber noch dahingehend, dass wenn ich den zweiten Explicit-Operator auskommentiere und den dritten aktiviere, dass es dann korrekt läuft. Dies könnte ich zwar ändern, aber erwartetes Verhalten wäre mir wesentlich lieber.

Stevie 6. Jun 2011 16:34

AW: Falscher Aufruf des überladenen Operators Explicit
 
siehe Kommentar von Barry Kelly

s.h.a.r.k 6. Jun 2011 20:01

AW: Falscher Aufruf des überladenen Operators Explicit
 
Naja, blöd an der Tatsache ist dann aber immer noch, dass der Compiler meint, dass es sich bei
Delphi-Quellcode:
@A
um ein TArray<T> handelt und einfach so das Programm compiliert, denn rein logisch handelt es sich bei
Delphi-Quellcode:
@A
eben noch eher um einen typisierten Pointer, als um ein Array vom Typ T. Aber gut, damit muss ich dann wohl oder übel leben müssen :roll:


Alle Zeitangaben in WEZ +1. Es ist jetzt 10:01 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