我有以下两种方法:
Sub Start()
Dim x As Dictionary
Set x = New Dictionary
Call x.Add("first", 1)
MsgBox TypeName(x.Items) 'Displays "Variant()"
Call Test(x.Items)
End Sub
Sub Test(withArray() As Variant)
End Sub
我的项目正在引用" Microsoft Scripting Runtime"提供上面使用的Dictionary
类。尽管x.Items
返回Variant()
(MsgBox TypeName(x.Items)
所示),我在Call Test(x.Items)
上收到以下编译错误:
类型不匹配:预期的数组或用户定义类型
有什么问题?
注意:如果我将Test
方法更改为:
Sub Test(withArray)
MsgBox TypeName(withArray)
End Sub
成功并显示Variant()
。为什么我不能将参数明确声明为Variant()
类型?
答案 0 :(得分:8)
Items
是未声明类型的Variant
,这意味着就编译器而言,它可以是运行时的任何东西 - 不一定是数组。当然,我们知道它将是一个数组,因为它是字典的一部分,但它没有声明的类型(对象浏览器显示它是一个没有返回类型的函数)所以它默认为Variant。由于编译器无法保证它在运行时是一个数组,因此它不允许您在Test()proc中尝试声明。
在运行时,它变为一个数组,因此TypeName()
将其显示为Variant()
有趣的是,VBA确实允许赋值给变量数组,所以这可行:
Sub Start()
Dim x As Dictionary
Dim y() As Variant
Set x = New Dictionary
Call x.Add("first", 1)
MsgBox TypeName(x.Items) 'Displays "Variant()"
y = x.Items ' this is fine
Call Test(y) 'this works
End Sub
Sub Test(withArray() As Variant)
End Sub