You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Delphi中如何实现支持开放数组的数组<T>的泛型MaxLength方法?

解决Delphi泛型MaxLength方法的编译错误问题

你遇到的编译错误是因为Delphi不支持直接将array of array of T作为开放数组参数使用——这个写法会被编译器解释为二维动态数组,但你实际需要的是接收多个一维动态数组组成的开放数组。下面是具体的解决步骤:

1. 修正泛型方法的参数类型

把方法参数从array of array of T改为array of TArray<T>,其中TArray<T>System.Generics.Collections中预定义的一维动态数组泛型别名,正好匹配你自定义的TArrayOfCarBrand(本质就是array of TCarBrand)。

修正后的TArray扩展类代码:

TArray = class(System.Generics.Collections.TArray)
public
  class function MaxLength<T>(const aArrays: array of TArray<T>): Integer;
end;

2. 保持方法逻辑不变

实现部分无需修改,因为aArrays[i]现在是TArray<T>类型,依然可以用Length()获取其长度:

class function TArray.MaxLength<T>(const aArrays: array of TArray<T>): Integer;
var
  i: Integer;
begin
  Result := 0;
  for i := Low(aArrays) to High(aArrays) do
    Result := MaxIntValue([Result, Length(aArrays[i])]);
end;

3. 正常调用泛型方法

现在你原来的调用代码就可以正常编译运行了:

vMaxLength := TArray.MaxLength<TCarBrand>([vCarsUS, vCarsEU, vCarsJP]);

额外说明

如果你不想依赖TArray<T>别名,也可以尝试定义参数类型为array of array of T的重载版本,但此时需要传入的是严格的二维数组而非多个一维数组——这显然不符合你的使用场景。所以使用array of TArray<T>是最贴合你需求的方案,既保留了泛型的灵活性,又和你现有的动态数组类型完美兼容。

内容的提问来源于stack exchange,提问作者Mike Torrettinni

火山引擎 最新活动