VB6 Variant类型

w00*_*977 1 vb6

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

Dim Test As Variant

Test = True

If Test = "True" Then //line 5
    MsgBox ("Test")
End If
Run Code Online (Sandbox Code Playgroud)

Ken*_*ite 8

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

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

if Test = "True"
Run Code Online (Sandbox Code Playgroud)

之后使用它作为原始分配类型(布尔值)

Test = True
Run Code Online (Sandbox Code Playgroud)

但是,在这里,你根本就没有使用变体; 你正在使用硬编码的字符串"Test".

  • VB6将自动在**any**数据类型的数据类型之间进行转换,而不仅仅是针对此答案中隐含的变体.这种转换有时被称为隐式转换或邪恶类型强制([pdf](http://vb.mvps.org/articles/pt199511.pdf)).它被广泛讨厌,这就是VB.Net中引入[Option Strict](http://stackoverflow.com/questions/222370)的原因. (2认同)
  • 我读到第一句话暗示 Test 变量的类型很重要。但如果 Test 被声明为 Boolean,VB6 的行为会相同。或者如果你比较文字。如果 True =“True”,则 MsgBox“啊哈!” Test is Variant 这一事实与类型强制无关。 (2认同)