[dcc32 Fatal Error]: F2084 Внутренняя ошибка: NC1921

Я пытаюсь скомпилировать следующий код в Delphi Rio:

unit untObjectHelper;

interface

uses
   SysUtils;

type
   TObjectHelper = class(TInterfacedObject)
   public
      class procedure Clone(const objOrigem: TObject; const objDestino: TObject);
   end;

implementation

uses
   System.Rtti;

{ TObjectHelper }

class procedure TObjectHelper.Clone(const objOrigem,
   objDestino: TObject);
begin
   if not Assigned(objOrigem) then
      Exit;

   if not Assigned(objDestino) then
      Exit;

   if objOrigem.ClassType <> objDestino.ClassType then
      Exit;

   var contexto := TRttiContext.Create;
   try
      var tipo := contexto.GetType(objOrigem.ClassType);
      var campos := tipo.GetFields();
   finally
      contexto.Free;
   end;
end;

end.

однако возникает следующая ошибка:

[dcc32 Fatal Error] untObjectHelper.pas (36): F2084 Внутренняя ошибка: NC1921

на линии:

var fields: = type.GetFields ();

версия: Embarcadero® Delphi 10.3 Версия 26.0.33219.4899

Я не нашел ссылки на эту ошибку, может кто-нибудь мне поможет? большое спасибо


person Passella    schedule 06.05.2019    source источник
comment
Похоже, вы должны сообщить об этом в QC. Не удивлен введением встроенных переменных. Попробуйте предварительно объявить эту переменную или и то, и другое. Вероятно, комбинация этого + RTTI.   -  person Jerry Dodge    schedule 06.05.2019
comment
У меня нет Rio, но в Сиэтле вы не можете объявить переменную с именем Type. Итак, я бы попробовал переименовать переменную в другое имя или использовать & Type.   -  person Ken Bourassa    schedule 06.05.2019
comment
@LURD, я исправил код, был переводчиком   -  person Passella    schedule 06.05.2019
comment
@JerryDodge вы правы, объявив в разделе переменных код скомпилирован   -  person Passella    schedule 06.05.2019
comment
@KenBourassa, я исправил код   -  person Passella    schedule 06.05.2019


Ответы (1)


Проблема заключается в выводе типа, спасибо Руди Велтуису за подсказку.

unit untObjectHelper;

interface

uses
   SysUtils;

type
   TObjectHelper = class(TInterfacedObject)
   public
      class procedure Clone(const objOrigem: TObject; const objDestino: TObject);
   end;

implementation

uses
   System.Rtti;

{ TObjectHelper }

class procedure TObjectHelper.Clone(const objOrigem,
   objDestino: TObject);
begin
   if not Assigned(objOrigem) then
      Exit;

   if not Assigned(objDestino) then
      Exit;

   if objOrigem.ClassType <> objDestino.ClassType then
      Exit;

   var contexto := TRttiContext.Create;
   try
      var tipo := contexto.GetType(objOrigem.ClassType);
      var campos: TArray<TRttiField> := tipo.GetFields();
   finally
      contexto.Free;
   end;
end;

end.
person Passella    schedule 06.05.2019
comment
В качестве альтернативы вы можете использовать исходный код со следующей поправкой: var campos: TArray<TRttiField> := tipo.GetFields();. Проблема не во встроенном объявлении, проблема в выводе типа, который не работает должным образом. - person Rudy Velthuis; 06.05.2019