自从我使用ASP以来已经有一段时间了,但是我在一个简单的赋值语句中遇到了类型不匹配错误。任何人都可以解释为什么会发生这种情况。
这样可行,但是当我尝试使用未分配的问题块时,我得到一个对象而不是集合错误
Class Survey
public ID
public Title
public Questions
End Class
Sub Test()
Dim oSurvey
Set oSurvey = new Survey
Dim aQuestions(2)
Set aQuestions(0) = new Question
' Other aQuestions assignments
oSurvey.Questions = aQuestions
End Sub
或者如果我将问题设置为动态数组,则分配失败并出现类型不匹配错误。
Class Survey
public ID
public Title
public Questions()
End Class
Sub Test()
Dim oSurvey
Set oSurvey = new Survey
Dim aQuestions(2)
Set aQuestions(0) = new Question
' Other aQuestions assignments
' Throws a Type mismatch error here
oSurvey.Questions = aQuestions
End Sub
有什么想法吗?
答案 0 :(得分:2)
回答你关于实际情况的问题。
当我试图找到一个未分配的时候 问题块我得到的对象不是 收集错误
For Each枚举源变量中的一组变体,它通过获取IEnumVARIANT来完成此操作。如果源变量包含对象,则应该具有此接口的实现。如果它是一个数组VBScript动态创建一个实现,它只能在数组已经标注尺寸的情况下执行此操作。源变量中的任何其他内容(例如在这种情况下为Empty)都将导致错误。
然后分配因类型不匹配错误而失败。
分配操作的左侧必须始终是变体。因此,不可能通过简单的赋值将一个动态数组的内容复制到另一个动态数组。
你的第一种方法是合理的声音,但你需要一种方法来表示一个空数组而不会崩溃For Each。你可以用这个小技巧: -
Function EmptyArray
EmptyArray = Split("", " ")
End Function
Class Survey
public ID
public Title
public Questions
Private Sub Class_Initialize
Questions = EmptyArray
End Sub
End Class
现在,如果您在为每个问题分配一个真正的数组之前尝试为每个问题,那么每个问题都不会按预期执行任何操作。此外,如果你使用UBound(Questions)+ 1来获得仍然准确的问题数,因为UBound(EmptyArray)是-1。
答案 1 :(得分:0)
如果我尝试将相同的代码粘贴到VBA(excel或word)中,则无法编译。
它显示了 public Questions()
行
--------------------------- Microsoft Visual Basic --------------------------- Compile error: Constants, fixed-length strings, arrays, user-defined types and Declare statements not allowed as Public members of object modules --------------------------- OK Help ---------------------------
在第一个示例中,您尚未将其定义为数组(它是变体&因此可以赋予任何值)。
答案 2 :(得分:0)
更新:我在ASP.NET中测试了这个,没有意识到问题是关于经典的ASP。我修改了下面的代码以使用经典ASP,但我还没有测试它:
Class Question
...
End Class
Class Survey
Public ID
Public Title
Public Questions As Question()
End Class
Sub Test()
Dim oSurvey As New Survey
Dim aQuestions(0 To 2) As Question
Set aQuestions(0) = New Question
...
Set oSurvey.Questions = aQuestions
End Sub
在您的第一个示例中,Survey.Questions
不是集合;在你的第二个,它是一个Variant
类型的数组。
答案 3 :(得分:0)
所以我最终坚持使用Array声明。另外,当我尝试ReDim数组时,我得到了一个错误。
ReDim oSurvey.Questions(2)
所以我创建了一个ReDim the Array的子例程,这很有效。
Class Survey
public ID
public Title
public Questions()
sub ReDimQuestions(count)
ReDim Questions(count)
end sub
End Class
Sub Test()
Dim oSurvey
Set oSurvey = new Survey
oSurvey.ReDimQuestions 2
Set oSurvey.Questions(0) = new Question
' Other aQuestions assignments
End Sub