[英]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;
这个赋值在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是字符编码的方式。 但我对他们感到困惑。
以下编译在所有版本的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
数组实现连接运算符,这些数组开始有所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);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.