Несоответствие типов при назначении массива в ASP - PullRequest
1 голос
/ 16 марта 2009

Прошло много времени с тех пор, как я работал с 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

Есть мысли?

Ответы [ 4 ]

2 голосов
/ 22 марта 2009

Чтобы ответить на ваш вопрос относительно того, что на самом деле происходит.

когда я пытаюсь проповедовать неназначенного Блок вопросов Я получаю Объект, а не ошибка сбора

Для каждого перечисляет набор вариантов из исходной переменной, он делает это путем получения IEnumVARIANT. Если исходная переменная содержит объект, ожидается, что у него будет реализация этого интерфейса. Если это массив, VBScript создает реализацию динамически, и он может сделать это только в том случае, если массив был измерен. Все остальное в исходной переменной (например, в данном случае пустое) приведет к ошибке.

, тогда назначение завершается неудачно с ошибкой несоответствия типов.

Левая часть операции присваивания всегда должна быть вариантом. Следовательно, невозможно скопировать содержимое одного динамического массива в другой с помощью простого присваивания.

Ваш первый подход достаточно разумный, но вам нужен способ представления пустого массива без сбоя 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 (Вопросы) + 1, чтобы получить количество вопросов, которое все еще будет точным, поскольку UBound (EmptyArray) равно -1.

0 голосов
/ 16 марта 2009

Обновление: Я проверил это в 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.

0 голосов
/ 18 марта 2009

Итак, я придерживался декларации Array. Кроме того, когда я попытался ReDim массив, как, таким образом, я получил ошибку.

ReDim oSurvey.Questions(2)

Итак, я создал подпрограмму ReDim для массива, и это сработало.

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
0 голосов
/ 16 марта 2009

Если я попытаюсь вставить тот же код в 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   
---------------------------

В первом примере вы не определили его как массив (это вариант и, следовательно, ему может быть присвоено любое значение).

...