在 Delphi 中添加字符串和变体
Adding strings and variants in Delphi
在 Delphi(10.2 东京)中添加字符串和变体的方式完全出乎我的意料。有人可以为此 "feature" 提供合理的解释,还是我们应该将其称为错误?
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;
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
.
在 Delphi(10.2 东京)中添加字符串和变体的方式完全出乎我的意料。有人可以为此 "feature" 提供合理的解释,还是我们应该将其称为错误?
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;
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
.