Добавление строк и вариантов в 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,

Другие вопросы по тегам