gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 15:07:23 26 4
gpt4 key购买 nike

我有以下变量声明:

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 数组实现串联运算符,就会开始了解一些情况。生成的代码首先将数组转换为 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);

关于delphi - Delphi 10.2 中无法将 char 数组分配给字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52846253/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com