2014-11-18 2 views
-1

При попытке вызвать функцию, которую я создал, я сталкиваюсь с ошибкой несоответствия типа.vbscript Ошибка несоответствия типа при вызове функции

Пример:

Function DoThis(paramA, paramB, paramC) 
    If paramA = "Something" Then 
     DoThis = DoSomething 
    ElseIf paramA = "This" Then 
     DoThis = DoSomethingDifferent 
    Else 
     DoThis = DoThisOtherThing 
    End If 
End Function 
Dim result: result = DoThis(valueA, ValueB, ValueC) 

Может кто-нибудь увидеть, что может быть моя ошибка? Другие функции работают правильно. Я дважды проверял орфографию, фактически копируя и вставляя имя функции, где я ее называю. Я проверил, что имя функции не используется нигде, т. Е. Как константа или что-то еще.

Обратите внимание, что при отладке этого параметра ValType для всех аргументов является vbString. Также я не могу войти в функцию, так что это не так, как будто я отлаживаю функцию, вводим ее, а затем получаю несоответствие типа.

ty.

+1

Ошибка несоответствия типа: вы попытались сравнить значения несовместимых типов данных. Например, сравнение строки и числового значения. _Чтобы исправить эту ошибку_: +++ Убедитесь, что типы данных совпадают при выполнении сравнений. +++ Передайте одно из значений типу данных другого и повторите сравнение. И 'EndIf' должен быть' End If' – JosefZ

+1

'EndIf' должен быть' End If'. Тогда код является синтаксически правильным; ошибка вызвана кодом, который вы не опубликовали. –

+0

Обратите внимание, что приведенное выше является просто псевдокодом, чтобы уменьшить сложность. Да, у меня была опечатка, когда я впервые набрал это. Мой существующий код похож на псевдокод, но он должен был только проиллюстрировать, что функция возвращает значение и что функция включает пути решения. –

ответ

3

VBScript имеет только один тип данных, называемый Вариант. A Вариант - это особый тип данных, который может содержать различные виды информации в зависимости от того, как он используется. Потому что Вариант является единственным типом данных в VBScript, это также тип данных, возвращаемый всеми функциями в VBScript.

Есть некоторые подтипы данных, которые Вариант может содержать (например, Empty, Null, string, integer, object, array и т.д.) Вы можете использовать некоторые функцию преобразования для преобразования данных из одного подтипа в другой, если это преобразование не подразумевается в VBScript. Теперь обратите внимание на реальный, фактический подтип данных True и vbTrue.

Правда ключевого слова (булева буквальное) имеет значение (внутреннее представление), равное -1.

С другой стороны, vbTrue является одним из немногих встроенных констант и, несмотря на его название, имеет подтип Integer! Это один из так называемых Tristate Константы:

Constant  Value Description 
vbUseDefault -2 Use default from computer's regional settings. 
vbTrue  -1 True 
vbFalse  0 False 

Я надеюсь, что следующий код может ясно все выше утверждений:

Wscript.Echo _ 
vbTrue, CStr(vbTrue), VarType(vbTrue), TypeName(vbTrue) , _ 
vbNewLine, True, CStr(True), VarType(True), TypeName(True) 

Однако, используемый с If _condition_ Then ..., есть некоторые особенности; Коротко: Then часть If ... заявления условно выполняет группы заявления только тогда, когда один тест Если условиенеFalse, то есть какие-либо ненулевое число почитает, чтобы быть правдой, а не только -1. Таким образом, вы можете использовать любую переменную или выражение (числовое или строка), вы выбираете, пока результат числовой ...

Подведение итогов: If _expr_ Then ... такое же, как If CBool(_expr_) Then ...

+0

JosefZ, Спасибо за комментарии. Я понял, что vbScript использовал варианты, и это должно было быть проблемой без проблем, но когда я столкнулся с ошибкой, когда я начал тестировать varType по значениям, поскольку они были заполнены на случай, если что-то у меня пропало. Но в этом случае я уже думал об этом и не просто пытался воссоздать функцию. : D –

0

Верный способ получить ошибку несоответствия типа для опубликованного кода - определить DoSomething и т. Д. Как Subs (что кажется вероятным, учитывая имена).

-1

Я не могу объяснить, почему это было проблемой, но сегодня я уменьшил функцию до простого возвращаемого значения boolean, и я все еще получил ошибку несоответствия типа.

Итак, я создал новую функцию с теми же параметрами и т. Д. Когда я изменил вызов новой функции, ошибка исчезнет.

Моя оригинальная функция с простой булевой возврата: (MISMATCH ERROR)

Function IsInstalledCheck(valueToCheck, expectedValue, checkType) 

    IsInstalledCheck = vbFalse 

End Function 

Моя новая функция с помощью простого возврата: (работ)

Function IsItemInstalled(valueToCheck, expectedValue, checkType) 

    IsItemInstalled = vbFalse 

End Function 

EDIT Обратите внимание, что я пытался это со стандартными значениями True/False. Решение состояло в том, чтобы просто воссоздать ту же функцию с новым именем и по какой-либо магической причине, которая сработала. Сигнатура функции была одинаковой, порядок переменных, имена переменных, условия теста, все в теле новой функции одинаковы.

+0

Обратите внимание, что я попытался вернуть значение с помощью vbFalse и FALSE, и результаты были одинаковыми для обоих тестов. –

1

Причина, почему RetVal является перенастройка ошибка несоответствия, поскольку она имеет числовое значение и значение альфа, а wsh это не нравится.

Смежные вопросы