变体但不是对象

Posted

技术标签:

【中文标题】变体但不是对象【英文标题】:Variant but not an Object 【发布时间】:2018-05-23 16:52:00 【问题描述】:

如果我知道一些数据将是一个对象,但我不知道是什么类型,我可以将它传递给这样的函数或例程:

Sub mySubExpectingAnObject(myVal As Object)

比哪个更明确

Sub mySubExpectingAnObject(myVal As Variant)

并且应该是首选,即使两者都有效

如果我知道数据位不是一个对象,但可能是其他任何东西(LongDoubleString 等),有什么方法可以@ 987654327@ing 参数不是对象。例如

Sub mySubExpectingNotAnObject(myVal As NotObject)

因为如果我在这里使用Variant,就不会有自动反对象检查。是否存在这种类型?一个可以专门封装任何非对象数据类型的?除了

之外还有其他的解决方法吗
If isObject(myVal) Then Err.Raise 5

或类似的?

【问题讨论】:

这里回答:***.com/questions/21572437/… Const vbObject = 9 与 ^^ ​​链接关联。但请注意您的问题特别是关于 Dim 未测试 .... Variant 存在 专门 以解除隐式类型转换尚未搞砸的编译时类型约束......不妨采取String,并从那里转换。 为什么重要的是它是什么“不是” 【参考方案1】:

我看不出使用 Variant 并抛出 无效的过程调用或参数运行时错误 5 有什么问题,字面意思说“这个过程被一个无效的参数调用”,给定IsObject(theParameter)返回True

Variant 存在专门以解除编译时类型约束,以便 VBA 可以处理诸如 IUnknown 之类的外来类型:你无法使用 Variant 并且对其执行任何类型的编译时检查 - 根据定义 Variant 的类型仅在运行时解析。

解决这个问题的惯用方法是为您的过程及其参数使用好的、有意义的名称。很难用你所拥有的例子来推荐任何东西。

没有“变体但不是对象”类型,您不能使用 Variant 并期望在编译时进行任何类型的类型验证。

【讨论】:

以上是关于变体但不是对象的主要内容,如果未能解决你的问题,请参考以下文章

将变体类型作为 REST 中的对象属性是不是合适?

c#中的变体数组

Boost::variant 与引用相同变体的对象

VBA:只有在公共对象模块中定义的用户定义类型才能被强制转换为变体或从变体强制转换或传递给后期绑定函数

如何在 django rest 框架中仅使用特定变体对象将项目添加到愿望清单?

查找行,其中名称变体,但不是电子邮件地址