无法在 VBA 中创建新枚举
Posted
技术标签:
【中文标题】无法在 VBA 中创建新枚举【英文标题】:Unable to create New Enum in VBA 【发布时间】:2014-11-03 18:53:42 【问题描述】:我正在 VBA 中创建一个不可变链接列表类。它提供了ToArray
和ToCollection
方法,我都验证过它们可以正常工作。但是Get NewEnum() As IUnknown
属性不起作用,我不知道为什么。
Public Property Get NewEnum() As IUnknown
Attribute NewEnum.VB_UserMemId = -4
Set NewEnum = ToCollection.[_NewEnum]
End Property
使用调试器将sequence
作为SList
逐步执行以下代码
Public Function Copy(ByVal sequence As Variant) As SList
Dim made As New SList
Dim element As Variant
For Each element In sequence
Set made = made.Cons(element)
Next
Set Copy = made.Reverse
End Function
显示For Each element In sequence
调用Get NewEnum
正确构建集合,然后返回Copy
并在没有执行迭代且没有错误后退出循环。我唯一的猜测是NewEnum
是一个变量的迭代器,该变量在退出Get NewEnum
时被销毁。
是这样吗?
【问题讨论】:
chat.stackexchange.com/transcript/message/18457890#18457890 【参考方案1】:Public Property Get NewEnum() As IUnknown
Attribute NewEnum.VB_UserMemId = -4
Set NewEnum = ToCollection.[_NewEnum]
End Property
ToCollection
每次调用都会返回一个新集合;这可能会起作用:
Public Property Get NewEnum() As IUnknown
Attribute NewEnum.VB_UserMemId = -4
Static internalCollection As Collection
If internalCollection Is Nothing Then Set internalCollection = ToCollection
Set NewEnum = internalCollection.[_NewEnum]
End Property
...但它相当丑陋。理想情况下,您应该有一些实例级别的 encapsulated As Collection
来返回 [_NewEnum]
值。
【讨论】:
静态变量是绑定到List的实例还是类的定义?例如,如果我循环一个列表然后创建另一个列表并尝试循环,我最终会循环第一个吗? 我只做了Static
因为你没有显示你的类的声明部分 - 我的直觉告诉我一个方法范围的Static
变量与实例级别相同,但我可能是错的。最好不要有 Static
方法范围的变量,而是在实例级别使用私有字段。以上是关于无法在 VBA 中创建新枚举的主要内容,如果未能解决你的问题,请参考以下文章