Почему мой код не компилируется, а получает E2506 Метод параметризованного типа, объявленный в разделе интерфейса, не должен использовать локальный символ
Я использую 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 ответа
Решение
Из 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
?
Я могу скомпилировать ваше устройство с D2010, DXE и DXE2 против версии 46 SuperObject.