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

时间:2018-10-17 01:56:03

标签: delphi delphi-10.2-tokyo delphi-6

我有以下变量声明:

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是字符编码的方式。但是我对此感到困惑。

1 个答案:

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