【问题标题】:VB6 Variant typeVB6 变体类型
【发布时间】:2012-04-18 22:09:20
【问题描述】:

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

Dim Test As Variant

Test = True

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

【问题讨论】:

  • 您的代码尝试将逻辑是/否与编译器可以判断的“foobar”进行比较。你喜欢它以哪种方式工作?编译器是否应该生成代码以将字符串转换为布尔值然后进行比较?还是应该生成将布尔值转换为字符串的代码?当您将“True”替换为“foobar”时,您的程序不会崩溃。尝试一下。现在你知道了。

标签: vb6


【解决方案1】:

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

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

if Test = "True"

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

Test = True

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

【讨论】:

  • 我知道为什么消息框中出现了 Test 这个词,而不是 True/False!您回答的第二部分解决了我的担忧。变量:Test 在我的代码的第 5 行隐式转换为字符串(我在原始问题中标记了第 5 行)?
  • @KirkWoll,你是对的。删除了不相关的文字。谢谢。 :) w0051977:是的,它是根据使用情况根据需要进行的隐式(自动)转换;这就是为什么它被称为variant(类型根据需要改变)。
  • VB6 将自动在 any 数据类型的数据类型之间进行转换,而不仅仅是此答案中暗示的变体。这种转换有时称为隐式类型转换或邪恶类型强制 (pdf)。它广受欢迎,这就是 VB.Net 中 Option Strict was introduced 的原因。
  • @MarkJ:我想这就是我在第一句话中所说的——“根据需要在数据类型之间自动转换”。我还展示了它将布尔值转换为字符串。你认为哪一部分是错误的(所以我可以重新阅读它,看看我是否可以更好地表达它)?
  • 我读到第一句话暗示 Test 变量的类型很重要。但是如果 Test 被声明为布尔值,VB6 的行为会相同。或者,如果您比较文字。 If True = "True" Then MsgBox "aha!" Test 是 Variant 的事实与类型强制无关。
【解决方案2】:

他们之所以在 MessageBox 中出现 Test 一词是因为您在消息框中显示了字符串“Test”

MsgBox ("Test")

你应该使用这个

MsgBox (Test)
猜你喜欢
  • 1970-01-01
  • 2011-06-14
  • 1970-01-01
  • 2022-01-02
  • 2010-12-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多