我有以下变量声明:
arrChar_1: array[0..2] of Char;
arrChar_2: array[0..2] of Char;
str: string;
然后我进行了作业:
str := arrChar_1 + arrChar_2;
此分配在Delphi 6上正常工作。但是在Delphi 10.2上编译时会出错:
[dcc32 Error] MigrateConcatenateCharArray.dpr(26): E2008 Incompatible types
我通过以下方式解决此问题:
str := Copy(first_arrChar, 0, StrLen(first_arrChar));
str := str + Copy(second_arrChar, 0, StrLen(second_arrChar));
此问题还有其他好的解决方法吗? (1)
在Delphi 6中:
String = AnsiString
Char = AnsiChar
在Delphi 10.2中:
String = UnicodeString
Char = WideChar
能否告诉我是什么原因导致了不兼容问题的发生? (2)
我了解到Widechar是一种多字节字符类型。 Unicode是字符编码的方式。但是我对此感到困惑。
答案 0 :(得分:9)
以下在所有版本的Delphi中编译:
procedure Main;
var
arrChar_1: array[0..2] of AnsiChar;
arrChar_2: array[0..2] of AnsiChar;
str: AnsiString;
begin
str := arrChar_1 + arrChar_2;
end;
以下代码在Unicode版本的Delphi中无法编译:
procedure Main;
var
arrChar_1: array[0..2] of WideChar;
arrChar_2: array[0..2] of WideChar;
str: UnicodeString;
begin
str := arrChar_1 + arrChar_2;
end;
这对我来说有点奇怪。为什么AnsiChar
数组不支持串联运算符?WideChar
数组为何不支持?
如果您研究如何为AnsiChar
数组实现串联运算符,那么该数组开始有所启发。生成的代码首先将数组转换为ShortString
实例。然后将它们转换为Delphi AnsiString
实例。最后,将两个AnsiString
实例串联起来。
现在,这将解释为什么WideChar
数组代码失败的原因。 ShortString
类型仅支持AnsiChar
元素,因此需要通过字符串支持例程的其他路径。可以假定Embarcadero设计人员出于某种原因选择了在实现Unicode支持时不支持这种形式的串联。
要支持此想法,请考虑以下事项:
procedure Main;
var
arrChar_1: array[0..254] of AnsiChar;
arrChar_2: array[0..254] of AnsiChar;
str: AnsiString;
begin
str := arrChar_1 + arrChar_2;
end;
编译。但是将254
的任何一个上限更改为255
,代码将无法编译(在Delphi的所有版本中)报告 E2008不兼容类型。那是因为数组现在超过了ShortString
对象的最大长度。
关于如何将代码迁移到Unicode Delphi,我建议您只需将字符数组转换为string
:
str := string(arrChar_1) + string(arrChar_2);