VB6变体类型

VB6变体类型,vb6,Vb6,我来自面向对象的背景。为什么在这个代码片段中显示“Test”(注意引号)。我希望逻辑测试:“If test=“True”返回False,因为变量包含布尔值而不是字符串。因此,我不希望出现消息框,但它确实: Dim Test As Variant Test = True If Test = "True" Then //line 5 MsgBox ("Test") End If VariantVB6中的类型值(以及支持它们的大多数其他语言)会根据需要在数据类型之间自动转换;它们在COM

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

Dim Test As Variant

Test = True

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

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

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

if Test = "True"
将其用作原始指定类型(布尔值)后


不过,在这里,您根本没有使用变体;您使用的是硬编码字符串
“Test”

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

MsgBox ("Test")
你应该用这个

MsgBox (Test)

我意识到为什么单词测试出现在消息框中而不是真/假!你回答的第二部分涉及我的关切。变量:Test是否隐式转换为代码第5行的字符串(我在原始问题中标记了第5行)?@KirkWoll,你说得对。删除不相关的文本。谢谢。:)w0051977:是的,它是根据使用情况根据需要进行的隐式(自动)转换;这就是为什么它被称为
变量
(类型会根据需要进行更改)。VB6将自动在任何数据类型的数据类型之间转换,而不仅仅是此答案中暗示的变量。这种转换有时称为隐式类型转换或邪恶类型强制()。它很不受欢迎,这就是为什么在VB.Net中使用它的原因。@MarkJ:我想这就是我在第一句话中所说的“根据需要自动在数据类型之间转换”。我还演示了如何将布尔值转换为字符串。你认为哪一部分是错误的(因此我可以重读一遍,看看是否可以更好地表达它)?我读了第一句话,认为这意味着测试变量的类型很重要。但如果将测试声明为布尔值,VB6的行为将相同。或者如果你比较文字。如果True=“True”,那么MsgBox“aha!”Test是Variant这一事实与类型强制无关。您的代码尝试将逻辑yes/no与“foobar”进行比较,直到编译器知道为止。你喜欢哪种工作方式?编译器是否应该生成代码将字符串转换为布尔值,然后进行比较?或者它应该生成将布尔值转换为字符串的代码吗?用“foobar”替换“True”时,程序不会崩溃。试试看。现在你知道了。你或
呼叫
MsgBox (Test)