【问题标题】:[dcc32 Fatal Error]: F2084 Internal Error: NC1921[dcc32 致命错误]:F2084 内部错误:NC1921
【发布时间】:2019-05-06 13:08:25
【问题描述】:

我正在尝试在 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 致命错误] untObjectHelper.pas (36): F2084 内部错误: NC1921

上线:

var fields: = type.GetFields ();

版本:Embarcadero® Delphi 10.3 版本 26.0.33219.4899

我没有找到此错误的参考,有人可以帮助我吗?非常感谢

【问题讨论】:

  • 看起来您应该向 QC 报告。对内联变量的引入并不感到惊讶。尝试预先声明该变量,或两者兼而有之。可能是 + RTTI 的组合。
  • 我没有 Rio,但是在西雅图,你不能声明一个名为“Type”的变量。因此,我会尝试将变量重命名为其他名称,或使用“&Type”。
  • @LURD,我修复了代码,是翻译器
  • @JerryDodge 你是对的,在变量部分声明,代码编译
  • @KenBourassa,我修复了代码

标签: delphi dcc32


【解决方案1】:

问题在于类型推断,感谢 Rudy Velthuis 的提示

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.

【讨论】:

  • 或者,您可以使用原始代码并进行以下修改:var campos: TArray&lt;TRttiField&gt; := tipo.GetFields();。问题不是内联声明,问题是类型推断,它不能正常工作。
猜你喜欢
  • 2014-11-01
  • 1970-01-01
  • 1970-01-01
  • 2013-02-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-01-31
  • 1970-01-01
相关资源
最近更新 更多