Почему мой код не компилируется, а получает E2506 Метод параметризованного типа, объявленный в разделе интерфейса, не должен использовать локальный символ - PullRequest
5 голосов
/ 03 декабря 2011

Я использую Delphi XE.

Следующее устройство не может скомпилировать с этой ошибкой:

[DCC Error] GTSJSONSerializer.pas(27): E2506 Method of parameterized type declared 
   in interface section must not use 
   local symbol 'TSuperRttiContext.AsJson<GTSJSONSerializer.TGTSJSONSerializer<T>.T>'

Почему это так?Есть ли обходной путь?

unit GTSJSONSerializer;

interface

type
   TGTSJSONSerializer<T> = class
     class function SerializeObjectToJSON(const aObject: T): string;
     class function DeserializeJSONToObject(const aJSON: string): T;
   end;

implementation

uses
        SuperObject
      ;

class function TGTSJSONSerializer<T>.SerializeObjectToJSON(const aObject: T): string;
var
  SRC: TSuperRttiContext;
begin
  SRC := TSuperRttiContext.Create;
  try
    Result := SRC.AsJson<T>(aObject).AsString;
  finally
    SRC.Free;
  end;
end;

class function TGTSJSONSerializer<T>.DeserializeJSONToObject(const aJSON: string): T;
var
  LocalSO: ISuperObject;
  SRC: TSuperRttiContext;
begin
  SRC := TSuperRttiContext.Create;
  try
    LocalSO :=  SO(aJSON);
    Result := SRC.AsType<T>(LocalSO);
  finally
    SRC.Free;
  end;
end;

end.

Ответы [ 2 ]

4 голосов
/ 03 декабря 2011

Из XE2 DocWiki :

Это происходит при попытке присвоить литеральное значение полю общих данных.

program E2506;

{$APPTYPE CONSOLE}

uses
  SysUtils;

type
  TRec<T> = record
  public
    class var x: Integer;
    class constructor Create;
  end;

class constructor TRec<T>.Create;
begin
  x := 4; // <-- e2506 Fix: overload the Create method to 
          // take one parameter x and assign it to the x field.
end;

begin
   Writeln('E2506 Method of parameterized type declared' +
           ' in interface section must not use local symbol');
end.

Я не могу сказать, на какую из локальных переменных он может возражать;у вас есть один местный в SerialObjectToJSON и два в DeserializeJSONToObject.Я также не уверен, основываясь на связанном исправлении, как именно это относится к опубликованному вами коду.Может ли это быть связано с TSuperRTTIContext?

1 голос
/ 03 декабря 2011

Я могу скомпилировать ваше устройство с D2010, DXE и DXE2 против версии 46 SuperObject.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...