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