Delphi: Generics, Interfaces
I get an internal compile error with Delphi XE3 Update 2 when I execute the following code:
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.
error-message:
[dcc32 Fatal Error] Unit1.pas(83): F2084 Internal Error: C13823
The solution is simply to add GUIDs to the interfaces.
Can anyone verify this? Is it maybe already fixed in a newer Delphi version? Where can we file a bugreport?
Can anyone verify this? Is it maybe already fixed in a newer Delphi version?
For the record:
This is fixed in Delphi XE4.
It also compiles just fine in XE2, so it seems to be specific to your version.
Where can we file a bugreport?
http://qc.embarcadero.com/wc/qcmain.aspx
在接口中按下CTRL + SHIFT + G键丢失GUID,如下所示:
IHasValueR<T> = interface
['{45609E3B-D9A6-40FB-B9E8-86E3FE0D20EF}']
function GetValue: T;
end;
链接地址: http://www.djcxy.com/p/67674.html
上一篇: 如何在Delphi中定义版本“和up”ifdefs?
下一篇: Delphi:泛型,接口