将变量数组传递给方法会产生"类型不匹配"错误

ror*_*.ap 6 vba

我有以下两种方法:

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
Run Code Online (Sandbox Code Playgroud)

我的项目引用"Microsoft Scripting Runtime"来提供Dictionary上面使用的类.尽管x.Items返回a Variant()(如下所示MsgBox TypeName(x.Items),我得到以下编译错误Call Test(x.Items):

类型不匹配:预期的数组或用户定义类型

怎么了?

注意:如果我将Test方法更改为:

Sub Test(withArray)
    MsgBox TypeName(withArray)
End Sub
Run Code Online (Sandbox Code Playgroud)

它成功并展示Variant().为什么我不能将参数显式声明为Variant()类型?

AFi*_*ein 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
Run Code Online (Sandbox Code Playgroud)