Warum werden Adressargumente für die Zurückweisungsprozedur formatiert, die mit XE4 @ beginne

Betrachten Sie dieses Programm:

{$APPTYPE CONSOLE}

uses
  System.SysUtils;

procedure Foo;
begin
end;

type
  TProcedure = procedure;

const
  FooConst: TProcedure = Foo;

var
  FooVar: TProcedure = Foo;
  P: Pointer;

{$TYPEDADDRESS ON}

begin
  P := @Foo;
  Writeln(Format('%p', [P]));
  Writeln(Format('%p', [@FooConst]));
  Writeln(Format('%p', [@FooVar]));
  Writeln(Format('%p', [@Foo]));
  Readln;
end.

Dieses Programm kompiliert und läuft auf XE3 und erzeugt die folgende Ausgabe:

00419FB8
00419FB8
00419FB8
00419FB8

uf XE4 und höher kann das Programm nicht kompiliert werden. In beiden Zeilen werden folgende Fehlermeldungen angezeigt:

Writeln(Format('%p', [@FooConst]));
Writeln(Format('%p', [@FooVar]));
[dcc32 Error] E2250 There is no overloaded version of 'Format' that can be called
with these arguments

uf XE4, XE5 und XE6 kompiliert das Programm, wenn$TYPEDADDRESS ist ausgeschaltet. Auf XE7 kann das Programm unabhängig von der Einstellung von @ nicht kompiliert werde$TYPEDADDRESS.

Ist das ein Compiler-Fehler? Oder verwende ich eine falsche Syntax, um die Adresse einer Prozedur zu erhalten?

Antworten auf die Frage(2)

Ihre Antwort auf die Frage