为何记录或类中的动态array of string与普通动态array of string类型不兼容?
为何记录/类中的动态string数组与普通动态string数组类型不兼容?
Delphi的动态数组类型规则很特殊:哪怕元素类型完全一致,只要动态数组的声明上下文不同,编译器就会把它们当成完全不同的类型。
拿你给出的代码举例:
- 直接声明的
SimpleArray1、SimpleArray2这类array of string,属于全局上下文的匿名动态数组类型,所有直接这么写的变量都共享同一个类型,所以它们之间的相加操作能正常编译。 - 而
TRec内部的ArrayInRecord: array of string,是在记录这个局部上下文里声明的,编译器会为它生成一个独有的动态数组类型——哪怕元素都是string,它和全局的array of string也不属于同一类型,自然就没法直接相加,触发E2008类型不兼容错误。
解决办法
有两种常用的处理方式:
- 统一使用具名动态数组类型
提前定义一个明确的动态数组类型,让所有变量(包括记录内的字段)都用这个类型,这样编译器就会把它们识别为同一类型:
type TStringArray = array of string; // 定义具名类型 TRec = record ArrayInRecord: TStringArray; // 记录内使用具名类型 end; var Rec: TRec; SimpleArray1, SimpleArray2, CombinedArrayOK, CombinedArrayFail: TStringArray; begin SimpleArray1 := ['1', '2']; SimpleArray2 := ['3', '4']; CombinedArrayOK := SimpleArray1 + SimpleArray2; Rec.ArrayInRecord := ['5', '6']; CombinedArrayFail := SimpleArray1 + Rec.ArrayInRecord; // 编译正常 end;
- 显式类型转换
如果不想修改类型定义,可以把记录内的数组显式转换成全局的array of string类型(Delphi XE及以上可以用TArray<string>,旧版本直接用array of string强制转换):
CombinedArrayFail := SimpleArray1 + TArray<string>(Rec.ArrayInRecord);
内容的提问来源于stack exchange,提问作者Matthias B
相关产品推荐
相关产品推荐

