Beim Portieren von Code von D2007 nach XE2 habe ich einen Compilerfehler bekommen, den ich nicht verstehen kann. Bitte beachten Sie das folgende Beispiel:
%Vor% D2007 kompiliert das ohne ein Problem. Der XE2-Compiler weist die mit //3
markierte Zeile mit
[DCC Fehler] Unit1.pas (38): E2010 Inkompatible Typen: 'string' und 'Pointer'
Ich schätze, das liegt daran, dass die neu hinzugefügten DrawText
Überladungen Delphi Strings akzeptieren.
Können Sie diesen Fehler erklären? Es ist kein großes Problem, da ich einen Workaround habe (explizites Casting), aber ich bin neugierig. Ist der Fehler in späteren Delphi-Versionen noch vorhanden?
Bearbeiten: Ich frage , ob im Compiler ein Fehler auftritt, nicht wegen einer Erklärung warum es dort ist. Es könnte gut sein, dass ich einen gültigen Grund für den Compiler übersehen habe, meinen Code abzulehnen.
Dies scheint keine normale Überladungsauflösungssituation zu sein. DrawText
ist doppelt definiert als:
Mit {$TYPEDADDRESS OFF}
scheint ein ^Char
vom Compiler als untypisiertes pointer
interpretiert zu werden, das niemals mit einem deklarierten Typ von PChar
kompatibel ist, während @c
anscheinend in ein PChar
aufgelöst wird. OK. Dies scheint im Widerspruch zu der Vorstellung zu stehen, dass {$TYPEDADDRESS OFF}
dazu gedacht ist, alle Zeiger typen-agnostisch zu machen. Es scheint, dass PChar
und ^Char
im Compiler irgendwie anders behandelt werden als andere Zeiger.
Mit {$TYPEDADDRESS ON}
werden sowohl @c
als auch ^Char
gleichwertig, aber seltsamerweise werden sie als Argumente akzeptiert, solange es keine Überladungsauflösung gibt.
In beiden Fällen scheint es, dass Überladungsauflösungen abgeschlossen sind, bevor die Typkompatibilität vollständig hergestellt ist . Ich bin mir nicht sicher, ob ich es einen Fehler nennen würde, aber ... es scheint ein Verhalten zu sein, das schwierig zu ändern wäre, ohne Probleme zu verursachen.
SSCCE
%Vor%Tags und Links delphi delphi-xe2 overload-resolution