在Delphi中添加字符串和变体

时间:2018-08-15 12:10:09

标签: delphi variants

在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 个答案:

答案 0 :(得分:10)

result := v + result

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

VarAdd

Condition                                          Result
Both expressions are strings                       Concatenated
[...]
One expression is numeric and the other a string   Addition
[...]

我怀疑VarAdd的定义是为了使VB用户更轻松。

result := result + '-' + v

这里result + '-'应该执行字符串连接,因为两个操作数都是字符串。然后将'3-' + v视为数字加法,要求将3-解析为数字。我认为,由于在某些情况下符号跟随数字,所以此解析成功并产生-3。将2添加到其中会得到-1