AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Sonstige Fragen zu Delphi Delphi Falscher Aufruf des überladenen Operators Explicit
Thema durchsuchen
Ansicht
Themen-Optionen

Falscher Aufruf des überladenen Operators Explicit

Ein Thema von s.h.a.r.k · begonnen am 6. Jun 2011 · letzter Beitrag vom 6. Jun 2011
Antwort Antwort
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
Benutzerbild von Stevie
Stevie

Registriert seit: 12. Aug 2003
Ort: Soest
4.016 Beiträge
 
Delphi 10.1 Berlin Enterprise
 
#2

AW: Falscher Aufruf des überladenen Operators Explicit

  Alt 6. Jun 2011, 17:34
siehe Kommentar von Barry Kelly
Stefan
“Simplicity, carried to the extreme, becomes elegance.” Jon Franklin

Delphi Sorcery - DSharp - Spring4D - TestInsight
  Mit Zitat antworten Zitat
Benutzerbild von s.h.a.r.k
s.h.a.r.k

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

AW: Falscher Aufruf des überladenen Operators Explicit

  Alt 6. Jun 2011, 21:01
Naja, blöd an der Tatsache ist dann aber immer noch, dass der Compiler meint, dass es sich bei @A um ein TArray<T> handelt und einfach so das Programm compiliert, denn rein logisch handelt es sich bei @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
»Remember, the future maintainer is the person you should be writing code for, not the compiler.« (Nick Hodges)
  Mit Zitat antworten Zitat
Antwort Antwort


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 06:22 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