编译器正在尝试解析对重载属性或过程的引用,但引用失败,因为参数是 Object
类型,并且引用对象具有接口的数据类型。 Object
参数强制编译器将引用解析为后期绑定。
在这些情况下,编译器通过实现类(而不是通过底层接口)来解决重载。 如果类重命名其中一个重载版本,编译器不会认为该版本是重载,因为它的名称不同。 这反过来会导致编译器在可能是解析引用的正确选择时忽略重命名的版本。
错误 ID:BC30933
更正此错误
使用
CType
将参数从Object
转换为你要调用的重载签名指定的类型。请注意,将引用对象强制转换为底层接口并没有帮助。 你必须强制转换参数以避免此错误。
示例
下面的示例显示了对在编译时导致此错误的重载 Sub
过程的调用。
Module m1
Interface i1
Sub s1(ByVal p1 As Integer)
Sub s1(ByVal p1 As Double)
End Interface
Class c1
Implements i1
Public Overloads Sub s1(ByVal p1 As Integer) Implements i1.s1
End Sub
Public Overloads Sub s2(ByVal p1 As Double) Implements i1.s1
End Sub
End Class
Sub Main()
Dim refer As i1 = New c1
Dim o1 As Object = 3.1415
' The following reference is INVALID and causes a compiler error.
refer.s1(o1)
End Sub
End Module
在前面的示例中,如果编译器允许按所写的方式调用 s1
,则解析将通过类 c1
而不是接口 i1
进行。 这意味着编译器不会考虑 s2
,因为它的名称在 c1
中不同,即使它是 i1
定义的正确选项。
可以通过将调用更改为以下任一代码行来更正错误:
refer.s1(CType(o1, Integer))
refer.s1(CType(o1, Double))
前面的每一行代码都将 Object
变量 o1
显式转换为为重载定义的参数类型之一。