Einzelnen Beitrag anzeigen

Benutzerbild von s.h.a.r.k
s.h.a.r.k

Registriert seit: 26. Mai 2004
3.159 Beiträge
 
#1

Falscher Aufruf des überladenen Operators Explicit

  Alt 6. Jun 2011, 17:08
Hier mal schnell der Code, über den ich im Folgenden reden werde
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 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. 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.
»Remember, the future maintainer is the person you should be writing code for, not the compiler.« (Nick Hodges)
  Mit Zitat antworten Zitat