![]() |
Falscher Aufruf des überladenen Operators Explicit
Hier mal schnell der Code, über den ich im Folgenden reden werde :stupid:
Delphi-Quellcode:
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.
// 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; Das Problem ist, dass Delphi beim Aufruf von
Delphi-Quellcode:
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.
TMyClass<T>(@A)
Delphi-Quellcode:
, dann wird korrekterweise der zweite Explicit-Operator aufgerufen.
TMyClass<String>(@A).Sort();
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. |
AW: Falscher Aufruf des überladenen Operators Explicit
|
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:
um ein TArray<T> handelt und einfach so das Programm compiliert, denn rein logisch handelt es sich bei
@A
Delphi-Quellcode:
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:
@A
|
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