8

在 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;
4

1 回答 1

10

result := v + result

Delphi 的Variant类型是 Win32 API 类型的略微扩展版本,VARIANT只要您不使用任何特定于 Delphi 的类型,就应该与它兼容。此外,当您使用特定于 Delphi 的字符串类型时,它的行为应该与使用 OLE 字符串类型一样。在 Win32 API 中,专门记录了添加字符串和数字将导致(数字)加法,而不是字符串连接,您需要有两个字符串操作数才能获得字符串连接:

VarAdd

条件结果
两个表达式都是字符串连接
[...]
一个表达式是数字,另一个是字符串
[...]

我怀疑VarAdd这样定义是为了让 VB 用户更容易。

result := result + '-' + v

这里result + '-'应该执行字符串连接,因为两个操作数都是字符串。'3-' + v然后将其视为数字加法,需要3-将其解析为数字。我相信,由于存在符号跟随数字的上下文,因此此解析成功并产生-3. 添加2到该结果中-1

于 2018-08-15T12:43:45.813 回答