无法将 char 数组分配给 Delphi 10.2 中的字符串

Can not assign char array to string in Delphi 10.2

我有以下变量声明:

arrChar_1: array[0..2] of Char;
arrChar_2: array[0..2] of Char;
str: string;

然后我做了作业:

str := arrChar_1 + arrChar_2;

这个赋值在Delphi6上正常运行。但是在Delphi10.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 是字符的编码方式。但我对他们感到困惑。

以下编译在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;

以下代码无法在 Delphi 的 Unicode 版本中编译:

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);