小编Pet*_*hez的帖子

为什么TGeneric <Base>和TGeneric <Descendant>不兼容?

我已经开始在Delphi 2010中使用泛型,但在编译这段代码时我遇到了问题:

TThreadBase = class( TThread )
...
end;

TThreadBaseList<T: TThreadBase> = class( TObjectList<T> )
...
end;

TDataProviderThread = class( TThreadBase )
...
end;

TDataCore = class( TInterfacedObject, IDataCore )
private
  FProviders: TThreadBaseList<TDataProviderThread>;
...
end;
Run Code Online (Sandbox Code Playgroud)

然后我有一些嵌套的过程:

procedure MakeAllThreadsActive(aThreads: TThreadBaseList<TThreadBase>);
begin
...
end;
Run Code Online (Sandbox Code Playgroud)

最后我想在TDataCore类的代码中调用这个嵌套过程:

MakeAllThreadsActive(FProviders);
Run Code Online (Sandbox Code Playgroud)

但编译器不想编译它,它说('<>'括号被'()'替换):

[DCC错误] LSCore.pas(494):E2010不兼容类型:'TThreadBaseList(TThreadBase)'和'TThreadBaseList(TDataProviderThread)'

虽然TDataProviderThread是TThreadBase的后代,但我不明白它.

我不得不通过艰难的类型转换来修复它:

MakeAllThreadsActive(TThreadBaseList<TThreadBase>(FProviders));
Run Code Online (Sandbox Code Playgroud)

有人知道为什么编译器会说这个错误吗?

delphi generics delphi-2010

13
推荐指数
2
解决办法
1402
查看次数

标签 统计

delphi ×1

delphi-2010 ×1

generics ×1