Impossibile applicare la risoluzione dell'overload con associazione tardiva a '<nomeprocedura>' perché l'istanza di accesso è un tipo interfaccia

Aggiornamento: novembre 2007

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

Il compilatore sta tentando di risolvere un riferimento a una proprietà o una routine in overload, ma il riferimento non ha esito positivo perché un argomento è di tipo Object e l'oggetto che fa riferimento ha il tipo di dati di un'interfaccia. L'argomento Object induce il compilatore a risolvere il riferimento come elemento ad associazione tardiva.

In queste condizioni, il compilatore risolve l'overload attraverso la classe di implementazione anziché attraverso l'interfaccia sottostante. Se la classe rinomina una delle versioni in overload, il compilatore non considera quella versione come overload perché il suo nome è diverso. Di conseguenza, il compilatore ignora la versione rinominata quando invece sarebbe stato opportuno elaborarla per risolvere il riferimento.

ID errore: BC30933

Per correggere l'errore

  • Utilizzare CType per eseguire il cast dell'argomento da Object al tipo specificato dalla firma dell'overload da chiamare.

    Si noti che non serve eseguire il cast dell'oggetto che fa riferimento sull'interfaccia sottostante. È necessario eseguire il cast dell'argomento per evitare questo errore.

Esempio

Nell'esempio seguente viene illustrata una chiamata a una routine Sub in overload che genera questo errore in fase di compilazione.

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

Nell'esempio precedente, se il compilatore consentisse la chiamata a s1 come è scritto, la risoluzione avverrebbe attraverso la classe c1 anziché attraverso l'interfaccia i1. Di conseguenza il compilatore non prenderebbe in considerazione s2 in quanto ha un nome diverso in c1, anche se sarebbe la scelta corretta secondo quanto definito da i1.

È possibile correggere l'errore modificando la chiamata a una delle seguenti righe di codice:

refer.s1(CType(o1, Integer))
refer.s1(CType(o1, Double))

Ciascuna delle righe di codice precedenti esegue esplicitamente il cast della variabile Objecto1 su uno dei tipi di parametro definiti per gli overload.

Vedere anche

Concetti

Overload della routine

Risoluzione dell'overload

Riferimenti

Funzione CType