Добавление строк и вариантов в Delphi
То, как добавление строк и вариантов ведет себя в Delphi (10.2 Tokyo), было для меня полной неожиданностью. Может ли кто-нибудь дать разумное объяснение этой "особенности" или мы назовем это ошибкой?
function unexpected: string;
var v: Variant;
begin
result := '3';
v := 2;
result := v + result;
ShowMessage(result); //displays 5, I expected 23
result := '3';
v := 2;
result := result + '-' + v;
ShowMessage(result) //displays -1, I expected 3-2
end;
1 ответ
result := v + result
Делфи Variant
тип является слегка расширенной версией Win32 API VARIANT
тип и должен быть совместим с ним, если вы не используете специфичные для Delphi типы. Кроме того, когда вы используете специфичные для Delphi строковые типы, он должен вести себя так же, как и в случае строкового типа OLE. В Win32 API специально задокументировано, что добавление строки и числа приведет к (числовому) добавлению, а не к конкатенации строк, для получения которой необходимо иметь два строковых операнда:
VarAdd
:
Состояние Результат Оба выражения являются строками [...] Одно выражение является числовым, а другое - строкой. [...]
Я подозреваю VarAdd
определяется так, чтобы облегчить жизнь пользователям VB.
result := result + '-' + v
Вот result + '-'
должен выполнить конкатенацию строк, так как оба операнда являются строками. '3-' + v
затем рассматривается как числовое дополнение, требующее 3-
быть разобранным как число. Я считаю, что, поскольку существуют контексты, в которых знак следует за цифрами, этот анализ завершается успешно и производит -3
, Добавление 2
что приводит к -1
,