Поделиться через


Разрешение перегружаемой функции с поздним связыванием не может быть применено к <имяПроцедура>, так как типом экземпляра, к которому осуществляется доступ, является интерфейс

Обновлен: Ноябрь 2007

Latebound overload resolution cannot be applied to '<procedurename>' because the accessing instance is an interface type

Компилятор пытается обратиться по ссылке к перегруженному свойству или процедуре, но доступ не выполняется, так как аргумент имеет тип Object и объект, к которому производится обращение, имеет тип данных интерфейса. Аргумент Object указывает компилятору разрешить ссылку с поздней привязкой.

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

Идентификатор ошибки: 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))

Каждая из строк предыдущего кода явно приводит переменную Objecto1 к одному из типов параметров, определенных для перегрузки.

См. также

Основные понятия

Перегрузка процедур

Разрешение перегрузки

Ссылки

Функция CType