在Delphi中添加字符串和变体

Pet*_*ter 8 delphi variants

在Delphi(东京10.2)中添加字符串和变体行为的方式让我感到非常惊讶.有人可以为这个"功能"提供合理的解释,还是我们称之为错误?

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;
Run Code Online (Sandbox Code Playgroud)

小智 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.