【问题标题】:vbscript Type mismatch error when calling function调用函数时vbscript类型不匹配错误
【发布时间】:2016-07-13 00:17:43
【问题描述】:

当我尝试调用我创建的函数时遇到类型不匹配错误。

例子:

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.

【问题讨论】:

  • 类型不匹配错误:您试图比较不兼容数据类型的值。例如,比较字符串和数值。 更正此错误: +++在执行比较时确保数据类型匹配。 +++将其中一个值转换为另一个值的数据类型,然后再次尝试比较。 EndIf 应该是 End If
  • EndIf 应该是 End If。那么代码在语法上是正确的;该错误是由您未发布的代码引起的。
  • 请注意,以上只是伪代码,以降低复杂性。是的,当我第一次输入这个时,我有一个错字。我现有的代码类似于伪代码,但这只是为了说明该函数返回一个值并且该函数涉及决策路径。
  • @JosefZ,谢谢。在调试时,我确实确认提供给该方法的所有值类型都是 vbString 类型。

标签: vbscript runtime-error


【解决方案1】:

VBScript 只有一种数据类型,称为VariantVariant 是一种特殊的数据类型,可以包含不同类型的信息,具体取决于它的使用方式。因为VariantVBScript中唯一的数据类型,也是VBScript中所有函数返回的数据类型。

Variant 可以包含一些数据子类型(例如 Empty, Null, string, integer, object, array 等)您可以使用一些 转换函数 将数据从一种子类型转换为另一种, 如果 VBScript 中没有隐式转换。现在,请注意TruevbTrue 的真实数据子类型。

True 关键字(boolean 文字)的值(内部表示)等于 -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 ...一起使用,有一些特殊性;简单来说: If ... 语句的 Then 部分仅在单个测试 If 条件 不是 False 时有条件地执行语句组,即任何非零数是真的,不仅仅是-1。因此,只要结果是数字,您就可以使用您选择的任何变量或表达式(数字或字符串)...

总结:If _expr_ Then ...If CBool(_expr_) Then ...

【讨论】:

  • JosefZ,感谢 cmets。我已经意识到 vbScript 使用了变体,它应该不是问题,但是当我遇到错误时,我开始在值上测试 varType,因为它们被填充以防万一我遗漏了什么。但在这种情况下,我想多了,并没有简单地尝试重新创建函数。 :D
【解决方案2】:

retval 重新调整不匹配错误的原因是因为它有一个数值和一个 alpha 值,而 wsh 不喜欢这样。

【讨论】:

    【解决方案3】:

    获得已发布代码的类型不匹配错误的可靠方法是将 DoSomething 等定义为 Subs(根据名称,这似乎很可能)。

    【讨论】:

      【解决方案4】:

      我无法解释为什么这是个问题,但今天我将函数简化为一个简单的布尔返回值,但仍然出现类型不匹配错误。

      然后我创建了一个具有相同参数等的新函数。当我更改对新函数的调用时,错误消失了。

      我的原始函数带有简单的布尔返回:(MISMATCH ERROR)

      Function IsInstalledCheck(valueToCheck, expectedValue, checkType)
      
          IsInstalledCheck = vbFalse
      
      End Function
      

      我的新函数带有一个简单的返回:(Works)

      Function IsItemInstalled(valueToCheck, expectedValue, checkType)
      
          IsItemInstalled = vbFalse
      
      End Function
      

      编辑 请注意,我也尝试过使用标准 True / False 值。解决方案是简单地重新创建具有新名称的相同功能,并且出于任何神奇的原因。函数签名是一样的,变量的顺序,变量名,测试条件,新函数体中的一切都是一样的。

      【讨论】:

      • 请注意,我曾尝试使用 vbFalse 和 FALSE 返回值,并且两个测试的结果相同。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-07-26
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多