You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何调整‘Array of T’类型数组大小?E2008编译报错求解

解决Delphi泛型方法中动态数组大小调整的编译错误问题

当你在泛型方法中使用var Array of T作为参数时,编译器无法将其正确识别为动态数组类型,导致SetLength触发E2008 Incompatible types错误。以下是两种无需使用TArray<T>的解决方案:

方案1:利用无类型参数与绝对地址映射

通过无类型参数接收数组,再用absolute关键字将其映射为指定类型的动态数组,从而正常调用SetLength:

class procedure ArrayUtils.test<T>(var myArray);
type
  TDynamicArray = array of T;
var
  DynArr: TDynamicArray absolute myArray;
begin
  SetLength(DynArr, 1);
end;

这种方式直接让DynArr指向传入数组的内存空间,绕过泛型参数的类型检查限制,操作后原数组的大小会被正确修改。

方案2:调用动态数组底层API

借助System.TypInfo单元的类型信息函数,结合底层的DynArraySetLength函数来调整数组大小:

uses
  System.TypInfo;

class procedure ArrayUtils.test<T>(var myArray: Array of T);
var
  ElTypeInfo: PTypeInfo;
  ElTypeData: PTypeData;
begin
  ElTypeInfo := TypeInfo(T);
  ElTypeData := GetTypeData(ElTypeInfo);
  DynArraySetLength(@myArray, 1, @ElTypeData^.ElSize);
end;

该方法通过获取元素的类型数据(包括元素大小),直接调用底层函数完成数组扩容/缩容,适合需要更底层控制的场景。

注意:两种方案都要求传入的参数必须是动态数组(即Array of T类型),传入静态数组会引发内存错误。

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.24 01:35:59