2015-05-19 28 views
5

ottengo l'errore: Class 'QueryParameterComparer' must implement 'Function Compare(x As QueryParameter, y As QueryParameter) As Integer' for interface 'System.Collections.Generic.IComparer(Of QueryParameter)'.errore che devo implementare una funzione in una classe, anche se è definita la funzione

In questa definizione di classe:

Protected Class QueryParameterComparer 
     Implements IComparer(Of QueryParameter) 

     Public Function Compare(x As QueryParameter, y As QueryParameter) As Integer 
      If x.Name = y.Name Then 
       Return String.Compare(x.Value, y.Value) 
      Else 
       Return String.Compare(x.Name, y.Name) 
      End If 
     End Function 

    End Class 

Ho anche provato a scriverlo in modo completo:

Protected Class QueryParameterComparer 
     Implements System.Collections.Generic.IComparer(Of QueryParameter) 

     Public Function Compare(x As QueryParameter, y As QueryParameter) As Integer 
      If x.Name = y.Name Then 
       Return String.Compare(x.Value, y.Value) 
      Else 
       Return String.Compare(x.Name, y.Name) 
      End If 
     End Function 

    End Class 

Cosa mi manca?

+3

L'implementazione del metodo di interfaccia richiede la parola chiave * Implements *. Lascia che l'IDE ti aiuti a cadere nella fossa del successo. Eliminare la funzione, posizionare il cursore dopo la linea Yadayada di Implementa e premere il tasto Invio. –

+1

Woah! Non l'ho mai visto prima! L'ho appena segnato come duplicato e poi ho capito che eri quello che ha fatto la domanda duplicata anni fa. Divertente ... –

+0

@StevenDoggart: LOL! : S Alcune persone non imparano mai? :) Non posso più cancellare questo post però .... – Flo

risposta

8

differenza in C#, in cui il nome del metodo deve solo corrispondere a quello nell'interfaccia, in VB.NET, tutte le implementazioni di interfaccia devono sempre essere esplicitamente indicate con Implements parole chiave su ciascun membro:

Protected Class QueryParameterComparer 
    Implements IComparer(Of QueryParameter) 

    Public Function Compare(x As QueryParameter, y As QueryParameter) As Integer Implements IComparer(Of QueryParameter).Compare 
     ' ... 
    End Function 
End Class 
3

VB.Net richiede di specificare quali metodi sono i metodi di implementazione delle interfacce.

Public Function Compare(x As QueryParameter, y As QueryParameter) As Integer Implements System.Collections.Generic.IComparer(Of QueryParameter).Compare 

È strano, ma consente di specificare un nome di funzione diverso per l'implementazione. In questo modo un accesso diretto alla classe può avere un solo nome per la funzione, ma un riferimento attraverso l'interfaccia dovrebbe avere il nome del metodo dell'interfaccia. Qualcos'altro che puoi fare è specificare il metodo a Private in modo da poter accedere al metodo solo attraverso un riferimento all'interfaccia.