通用数组的类型不兼容

时间:2016-02-03 17:39:47

标签: delphi generics

当您查看一些示例代码(我删除了所有不必要的代码)时,最好解释这个问题:

program XE8GenericArrayTest;

{$APPTYPE CONSOLE}

type
  TArrayUtilCls<T: class> = class
  public
    class procedure AddArray<U: T>(var Arr_: TArray<T>; ArrayToAdd: TArray<U>);
    class procedure MergeArrays(var Arr_: TArray<T>; ArrayToAdd: TArray<T>);
  end;
  TBaseCls = class
  end;
  TChild = class(TBaseCls)
  end;

{ TArrayUtilCls<T> }

class procedure TArrayUtilCls<T>.AddArray<U>(var Arr_: TArray<T>;
  ArrayToAdd: TArray<U>);
begin
  // ... some logic to merge the arrays
end;

class procedure TArrayUtilCls<T>.MergeArrays(var Arr_: TArray<T>;
  ArrayToAdd: TArray<T>);
begin
  // THE FOLLOWING CODE LINE DOES NOT COMPILE
  // E2515 Type parameter 'U' is not compatible with type 'T'
  AddArray<T>(Arr_, ArrayToAdd);
end;

var
  ArrBase: TArray<TBaseCls>;
  ArrChildren: TArray<TChild>;
begin
  // ... allocate memory
  TArrayUtilCls<TBaseCls>.AddArray<TChild>(ArrBase, ArrChildren);
end.

TArrayUtilCls包含一个将子类型数组添加到基类型数组AddArray的方法 - 这样可以正常工作。

现在我还想添加一个对2个相同类型的数组执行相同操作的方法:MergeArrays

我认为它应该只是调用AddArray<T>方法,因为U必须从T延伸:但是Delphi给了我一个编译错误(参见源代码中的注释) )。

0 个答案:

没有答案