Delphi:泛型、接口-->;内部错误

Delphi:泛型、接口-->;内部错误,delphi,interface,delphi-xe3,Delphi,Interface,Delphi Xe3,执行以下代码时,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

执行以下代码时,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.
单元1;
接口
类型
IHasValueR=接口
函数GetValue:T;
结束;
IHasValueRw=接口(IHasValueR)
程序设定值(新值:T);
结束;
TDummy=类别(TInterfacedObject)
结束;
TRefObj=类别(TInterfacedObject、IHasValueR、IHasValueRw)
严格保密
值:布尔值;
公众的
构造函数创建(初始化:布尔);
函数GetValue:Boolean;
过程设置值(新值:布尔值);
结束;
TValueProviderFct=对函数的引用(输入:T):V;
TBar=类
严格保密
FValueProviderFct:TValueProviderFct;
公众的
构造函数创建(ValueProviderFct\uTValueProviderFCT);
函数GetValue(输入:T):布尔值;
结束;
程序TestIt();
实施
程序TestIt();
变量
Foo:TRefObj;
酒吧:待定;
开始
Foo:=TRefObj.Create(true);
Bar:=TBar.Create(
功能(输入:TRefObj):IHasValueRw
开始
结果:=输入;
结束
);
Bar.GetValue(Foo);
结束;
{TSetupDefinitionItemBoolean}
构造函数TRefObj.Create(初始化:布尔);
开始
值:=初始值;
结束;
函数TRefObj.GetValue:布尔型;
开始
结果:=数值;
结束;
过程TRefObj.SetValue(NewValue:Boolean);
开始
值:=新值;
结束;
{TBar}
构造函数TBar.Create(ValueProviderFct_u2;:TValueProviderFct);
开始
FValueProviderFct:=ValueProviderFct;
结束;
函数TBar.GetValue;
开始
结果:=FValueProviderFct(输入).GetValue;
结束;
结束。
错误消息:

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

解决方案只是向接口添加guid

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

有人能证实这一点吗?它可能已经在更新的Delphi版本中修复了吗

记录如下:
这在DelphiXe4中是固定的

它在XE2中也可以很好地编译,因此它似乎是特定于您的版本的

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


忽略GUID,在界面中,按CTRL+SHIFT+G键,如下所示:

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

除非XE5上存在问题,否则提交错误报告是毫无意义的,XE5是当前版本的文件错误:但正如David所说,这是毫无意义的,因为它已经修复了。为已经解决的错误提交错误报告从来都不是无意义的——它们至少是文档。它们还可能为未来提供测试用例,以防止回归。第83行是什么?为什么不标记或引用,或者我们真的需要计算所有这些行-(