【问题标题】:Delphi: Generics, Interfaces --> Internal ErrorDelphi:泛型,接口->内部错误
【发布时间】:2013-11-19 17:40:52
【问题描述】:

当我执行以下代码时,Delphi XE3 Update 2 出现内部编译错误:

unit Unit1;

interface

type
  IHasValueR<T> = interface
    function GetValue: T;
  end;

  IHasValueRw<T> = interface(IHasValueR<T>)
    procedure SetValue(NewValue: T);
  end;
  TDummy = class(TInterfacedObject)

  end;

  TRefObj = class(TInterfacedObject, IHasValueR<Boolean>, IHasValueRw<Boolean>)
  strict private
    Value: Boolean;
  public
    constructor Create(Init_: Boolean);
    function GetValue: Boolean;
    procedure SetValue(NewValue: Boolean);
  end;

  TValueProviderFct<T, V> = reference to function(Input: T): V;

  TBar<T; V: IHasValueRw<Boolean>> = class
  strict private
    FValueProviderFct: TValueProviderFct<T, V>;
  public
    constructor Create(ValueProviderFct_: TValueProviderFct<T, V>);
    function GetValue(Input: T): Boolean;
  end;

procedure TestIt();

implementation

procedure TestIt();
var
  Foo: TRefObj;
  Bar: TBar<TRefObj, IHasValueRw<Boolean>>;
begin
  Foo := TRefObj.Create(true);

  Bar := TBar<TRefObj, IHasValueRw<Boolean>>.Create(
    function (Input: TRefObj): IHasValueRw<Boolean>
    begin
      Result := Input;
    end
  );
  Bar.GetValue(Foo);
end;

{ TSetupDefinitionItemBoolean }

constructor TRefObj.Create(Init_: Boolean);
begin
  Value := Init_;
end;

function TRefObj.GetValue: Boolean;
begin
  Result := Value;
end;

procedure TRefObj.SetValue(NewValue: Boolean);
begin
  Value := NewValue;
end;

{ TBar<T, V> }

constructor TBar<T, V>.Create(ValueProviderFct_: TValueProviderFct<T, V>);
begin
  FValueProviderFct := ValueProviderFct_;
end;

function TBar<T, V>.GetValue;
begin
  Result := FValueProviderFct(Input).GetValue;
end;

end.

错误消息:

[dcc32 致命错误] Unit1.pas(83): F2084 内部错误: C13823

解决方案只是将 GUID 添加到接口。

任何人都可以验证这一点吗? 它可能已经在较新的 Delphi 版本中修复了吗? 我们可以在哪里提交错误报告?

【问题讨论】:

  • 除非当前版本 XE5 存在问题,否则提交错误报告毫无意义
  • 在此处提交错误:qc.embarcadero.com/wc/qcmain.aspx 但正如大卫所说,因为它已经修复了,所以毫无意义
  • 为已解决的错误提交错误报告绝不是毫无意义的——它们至少是文档。他们还可能为将来提供测试用例以防止回归。
  • 第 83 行是什么?为什么不标记或引用,或者我们真的需要计算所有这些行吗? :-(

标签: delphi interface delphi-xe3


【解决方案1】:

任何人都可以验证这一点吗?它可能已经在较新的 Delphi 版本中修复了吗?

记录在案:
这在 Delphi XE4 中已修复。

它在 XE2 中也编译得很好,所以它似乎是特定于你的版本的。

我们可以在哪里提交错误报告?

http://qc.embarcadero.com/wc/qcmain.aspx

【讨论】:

    【解决方案2】:

    缺少GUID,在界面中,按键CTRL + SHIFT + G,如下:

      IHasValueR<T> = interface
    ['{45609E3B-D9A6-40FB-B9E8-86E3FE0D20EF}']
        function GetValue: T;
      end;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-03-22
      • 1970-01-01
      • 2011-04-04
      • 1970-01-01
      • 2012-12-15
      • 1970-01-01
      • 2022-01-21
      相关资源
      最近更新 更多