我有以下两种方法:
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()
类型?
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)
归档时间: |
|
查看次数: |
2682 次 |
最近记录: |