VB6的Variant类型

3

我来自面向对象编程背景。为什么在这段代码中,“Test”(注意引号)会在消息框中显示?我期望的逻辑测试:“如果 Test =“True””将返回 False,因为变量包含布尔值而不是字符串。因此我不希望消息框出现,但它确实出现了:

Dim Test As Variant

Test = True

If Test = "True" Then //line 5
    MsgBox ("Test")
End If

1
您的代码尝试将逻辑“是/否”与“foobar”进行比较,就编译器来说。您希望哪种方式运行?应该生成代码将字符串转换为布尔值,然后进行比较吗?还是应该生成代码将布尔值转换为字符串?当您用“foobar”替换“True”时,程序不会崩溃。试一试。现在您知道了。 - Hans Passant
2个回答

10

Variant 类型的值在 VB6(以及大多数支持它们的其他语言中)会根据需要自动转换数据类型;它们广泛用于 COM 交互。

你正在使用的代码在此处使用了从布尔值到字符串的自动(隐式)转换:

if Test = "True"

在这里将其用作其原始分配类型(布尔值)之后

Test = True

不过在这里,你根本没有使用这个变量,你正在使用一个硬编码的字符串"Test"


1
我明白为什么MessageBox中出现了单词“Test”,而不是True/False!你回答的第二部分解决了我的疑虑。在我的代码的第5行(我在原始问题中标记了第5行),变量Test是否被隐式转换为字符串? - w0051977
1
@KirkWoll,你说得对。已删除无关文本。谢谢。 :) w0051977:是的,它是根据使用需要隐式(自动)转换;这就是为什么它被称为 variant(类型根据需要更改)。 - Ken White
3
VB6会自动转换任何数据类型之间的数据类型,而不仅仅是变量类型,正如本答案所暗示的那样。这种转换有时被称为隐式类型转换或恶意类型强制转换(pdf)。它广泛地不受欢迎,这就是为什么在VB.Net中引入了Option Strict的原因。 - MarkJ
1
@MarkJ:我觉得这就是我在第一句话中说的 - “根据需要自动转换数据类型”。我还展示了它将布尔值转换为字符串的过程。你认为哪个部分有问题(这样我可以重新阅读并尝试用更好的措辞来表达)? - Ken White
2
我理解第一句话的意思是暗示 Test 变量的类型很重要。但是,如果在 VB6 中将 Test 声明为布尔值,或者比较字面值,VB6 的行为都是相同的。例如:If True = "True" Then MsgBox "aha!"。Test 是 Variant 类型并不影响类型强制转换。 - MarkJ

1

出现“Test”单词在 MessageBox 中的原因是因为你在消息框中显示了字符串“Test”

MsgBox ("Test")

你应该使用这个

MsgBox (Test)

2
当不使用函数的结果或Call时,不应在参数周围使用括号。 - Deanna

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接