Следующие компиляции во всех версиях 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);