如何调整‘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
相关产品推荐
相关产品推荐

