BC30933:后期绑定重载决策不能应用于“<procedurename>”,因为访问实例是一个接口类型

编译器正在尝试解析对重载属性或过程的引用,但引用失败,因为参数是 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 显式转换为为重载定义的参数类型之一。

另请参阅