Nota
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare ad accedere o modificare le directory.
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare a modificare le directory.
Questo articolo illustra gli errori del compilatore seguenti:
- CS0071: un'implementazione esplicita dell'interfaccia di un evento deve usare la sintassi della funzione di accesso agli eventi.
- CS0106: il modificatore non è valido per questo elemento.
- CS0277: il membro non implementa il membro dell'interfaccia perché non è pubblico.
- CS0425: i vincoli per il parametro di tipo del metodo devono corrispondere ai vincoli per il parametro di tipo del metodo di interfaccia. Prendere in considerazione l'uso di un'implementazione esplicita dell'interfaccia.
- CS0460: i vincoli per i metodi di implementazione dell'interfaccia di override ed espliciti vengono ereditati dal metodo di base, pertanto non possono essere specificati direttamente, ad eccezione di una 'classe' o di un vincolo 'struct'.
- CS0470: Il metodo non può implementare l'accessor dell'interfaccia per il tipo. Usare un'implementazione esplicita dell'interfaccia.
- CS0473: l'implementazione esplicita dell'interfaccia 'nome metodo' corrisponde a più di un membro dell'interfaccia. Quale membro di interfaccia viene effettivamente scelto è dipendente dall'implementazione. Prendere invece in considerazione l'uso di un'implementazione non esplicita.
- CS0531: i membri dell'interfaccia non possono avere una definizione.
- CS0535: Il membro non implementa il membro dell'interfaccia.
- CS0538: l'elemento nella dichiarazione esplicita di interfaccia non è un'interfaccia.
- CS0539: il membro nella dichiarazione di interfaccia esplicita non viene trovato tra i membri dell'interfaccia che è possibile implementare.
- CS0540: il tipo contenitore non implementa il membro dell'interfaccia.
- CS0541: la dichiarazione di interfaccia esplicita può essere dichiarata solo in una classe, un record, uno struct o un'interfaccia.
- CS0550: Un membro aggiunge un accessor non presente nel membro dell'interfaccia.
- CS0551: l'implementazione esplicita dell'interfaccia manca di un metodo di accesso.
- CS0630: il membro non può implementare un membro dell'interfaccia perché ha un parametro __arglist.
- CS0686: La funzione di accesso non può implementare il membro dell'interfaccia. Usare un'implementazione esplicita dell'interfaccia.
- CS0736: il membro non implementa il membro dell'interfaccia dell'istanza. Non può implementare il membro dell'interfaccia perché è statico.
- CS0737: il membro non implementa il membro dell'interfaccia. Non può implementare un membro di interfaccia perché non è pubblico.
- CS0738: un membro non implementa il membro dell'interfaccia. Non può perché non ha il tipo di ritorno corrispondente.
- CS8705: il membro di interfaccia non dispone di un'implementazione più specifica. Nessuno dei due membri è più specifico.
- CS8854: Il membro non implementa il membro dell'interfaccia.
- CS9333: Il tipo di parametro deve corrispondere al membro implementato.
- CS9334: il tipo restituito deve corrispondere al membro implementato.
Dichiarazione e sintassi dell'interfaccia
Gli errori seguenti si riferiscono alla sintassi e alla struttura appropriate durante la dichiarazione di implementazioni esplicite dell'interfaccia:
- CS0071: un'implementazione esplicita dell'interfaccia di un evento deve usare la sintassi della funzione di accesso agli eventi.
- CS0106: il modificatore non è valido per questo elemento.
- CS0531: i membri dell'interfaccia non possono avere una definizione.
- CS0538: Il membro dichiarato in modo esplicito per l'interfaccia non è un'interfaccia.
- CS0541: la dichiarazione di interfaccia esplicita può essere dichiarata solo in una classe, un record, uno struct o un'interfaccia.
È possibile correggere questi errori usando le tecniche seguenti:
- È necessario specificare manualmente gli accessori degli eventi
adderemovequando si implementa in modo esplicito un evento dell'interfaccia (CS0071). Il compilatore non genera automaticamente queste funzioni di accesso per le implementazioni esplicite dell'interfaccia, pertanto è necessario definirle in modo esplicito per specificare come viene archiviato e gestito l'evento. - Rimuovere il
publicmodificatore dalle implementazioni esplicite dell'interfaccia (CS0106). Le implementazioni esplicite dell'interfaccia sono pubbliche in modo implicito quando si accede tramite il tipo di interfaccia, rendendo lapublicparola chiave ridondante e non consentita in questo contesto. - Rimuovere il
abstractmodificatore dalle implementazioni esplicite dell'interfaccia (CS0106). Le implementazioni esplicite dell'interfaccia forniscono l'implementazione effettiva e non possono essere contrassegnate come astratte perché non possono essere sottoposte a override nelle classi derivate. - Rimuovere il corpo del metodo dalle dichiarazioni dei membri dell'interfaccia o spostare l'implementazione in una classe o uno struct che implementa l'interfaccia (CS0531). Prima di C# 8.0, i membri dell'interfaccia non possono contenere implementazioni; a partire da C# 8.0, è possibile fornire metodi di interfaccia predefiniti usando una sintassi specifica.
- Verificare che il tipo specificato nella dichiarazione di interfaccia esplicita sia un tipo di interfaccia effettivo (CS0538). Solo i tipi di interfaccia possono essere usati nella sintassi esplicita dell'implementazione dell'interfaccia; il tentativo di usare una classe o un altro tipo non di interfaccia viola le regole di implementazione esplicite.
- Spostare dichiarazioni di interfaccia esplicite in una classe o uno struct che dichiara l'interfaccia nel relativo elenco di base (CS0541). Le implementazioni esplicite dell'interfaccia devono essere visualizzate all'interno del corpo di un tipo di classe o struct e non possono essere dichiarate a livello di spazio dei nomi o in altri contesti.
Per altre informazioni, vedere Interfacce, Implementazione esplicita dell'interfaccia e Come implementare eventi di interfaccia.
Tipi e firme restituiti
Gli errori seguenti si verificano quando la firma del metodo di implementazione non corrisponde alla dichiarazione del membro dell'interfaccia:
- CS0738: Il membro non implementa il membro dell'interfaccia. Non può farlo perché il tipo di ritorno non è corrispondente.
- CS8854: Il membro non implementa il membro dell'interfaccia.
- CS9333: Il tipo di parametro deve corrispondere al membro implementato.
- CS9334: il tipo restituito deve corrispondere al membro implementato.
È possibile correggere questi errori usando le tecniche seguenti:
- Modificare il tipo restituito del metodo di implementazione in modo che corrisponda esattamente al tipo restituito dichiarato nel membro dell'interfaccia (CS0738, CS9334). La firma dell'implementazione deve corrispondere esattamente alla dichiarazione di interfaccia perché la firma del metodo fa parte del contratto che determina quale membro dell'interfaccia viene implementato.
- Assicurarsi che i tipi di parametro nel metodo di implementazione corrispondano esattamente ai tipi di parametro dichiarati nel membro dell'interfaccia (CS9333). Ogni parametro deve avere il tipo identico nella stessa posizione specificata nella dichiarazione di interfaccia, poiché i tipi di parametro sono componenti fondamentali della firma del metodo usata dal compilatore per associare le implementazioni ai membri dell'interfaccia.
- Aggiungere un
initmetodo di accesso alla proprietà di implementazione quando la proprietà di interfaccia dichiara uninitsetter (CS8854). Lainitparola chiave consente l'inizializzazione delle proprietà durante la costruzione di oggetti impedendo la modifica in un secondo momento e la proprietà di implementazione deve fornire questo stesso comportamento di inizializzazione per soddisfare il contratto di interfaccia.
Per altre informazioni, vedere Interfacce, Proprietà e setter di sola inizializzazione.
Implementazioni mancanti o incomplete
Gli errori seguenti si verificano quando una classe non implementa completamente un'interfaccia o implementa membri che non corrispondono al contratto di interfaccia:
- CS0535: Il membro non implementa il membro dell'interfaccia richiesto.
- CS0550: Membro aggiunge un metodo di accesso non presente nell'interfaccia.
- CS0551: l'implementazione esplicita dell'interfaccia manca di un metodo di accesso.
È possibile correggere questi errori usando le tecniche seguenti:
- Fornire un'implementazione per ogni membro dichiarato nell'interfaccia o dichiarare il tipo come
abstract(CS0535). Ogni membro deve essere implementato per soddisfare i requisiti dell'interfaccia. - Rimuovere tutte le funzioni di accesso dalla proprietà di implementazione che non sono dichiarate nella proprietà dell'interfaccia (CS0550). La proprietà di implementazione può includere solo le funzioni di accesso dichiarate in modo esplicito nella definizione dell'interfaccia, assicurandosi che l'implementazione non aggiunga funzionalità oltre a quanto specificato dal contratto di interfaccia.
- Aggiungere tutte le funzioni di accesso necessarie all'implementazione esplicita dell'interfaccia in modo che corrisponda alla dichiarazione di interfaccia (CS0551). Ogni funzione di accesso dichiarata nell'interfaccia deve avere una funzione di accesso corrispondente nell'implementazione con firme corrispondenti, perché l'implementazione deve soddisfare il contratto completo della funzione di accesso definito dall'interfaccia.
Per altre informazioni, vedere Interfacce e proprietà.
Corrispondenza e risoluzione dei membri
Quando si tenta di implementare membri di interfaccia che non esistono nell'interfaccia o quando il tipo contenitore non dichiara l'interfaccia, si verificano gli errori seguenti:
- CS0539: il membro nella dichiarazione di interfaccia esplicita non viene trovato tra i membri dell'interfaccia che è possibile implementare.
- CS0540: Il tipo che lo contiene non implementa il membro dell'interfaccia.
È possibile correggere questi errori usando le tecniche seguenti:
- Verificare che il nome e la firma del membro nell'implementazione esplicita dell'interfaccia corrispondano esattamente a un membro dichiarato nell'interfaccia o rimuovere l'implementazione non corretta (CS0539). Il membro che si sta tentando di implementare deve effettivamente esistere nella definizione dell'interfaccia con il nome corrispondente, il tipo restituito e i tipi di parametro, perché l'implementazione esplicita dell'interfaccia richiede una corrispondenza precisa con il contratto di interfaccia.
- Aggiungere l'interfaccia all'elenco di base della classe o dello struct oppure rimuovere l'implementazione esplicita dell'interfaccia (CS0540). Un tipo può implementare in modo esplicito solo i membri delle interfacce dichiarate nel relativo elenco di ereditarietà, pertanto il tipo di implementazione deve stabilire la relazione di interfaccia prima di poter fornire implementazioni esplicite.
Per altre informazioni, vedere Interfacce ed Implementazione esplicita dell'interfaccia.
Vincoli di tipo generico
Durante l'implementazione di metodi di interfaccia generici con vincoli di parametro di tipo si verificano gli errori seguenti:
- CS0425: i vincoli per il parametro di tipo del metodo devono corrispondere ai vincoli per il parametro di tipo del metodo di interfaccia. Prendere in considerazione l'uso di un'implementazione esplicita dell'interfaccia.
- CS0460: i vincoli per i metodi di implementazione dell'interfaccia di override ed espliciti vengono ereditati dal metodo di base, pertanto non possono essere specificati direttamente, ad eccezione di una 'classe' o di un vincolo 'struct'.
È possibile correggere questi errori usando le tecniche seguenti:
- Verificare che la
whereclausola nel metodo di implementazione sia identica alla dichiarazione del metodo di interfaccia o corrisponda al significato semantico dei vincoli (CS0425). I vincoli dei parametri di tipo nell'implementazione devono corrispondere a quelli definiti nell'interfaccia o nel metodo di base. - Rimuovere le dichiarazioni di vincolo esplicite dai metodi di override e di implementazione esplicita dell'interfaccia (CS0460). Il metodo di override eredita automaticamente i vincoli dal metodo di base o di interfaccia, quindi la ripetizione delle richieste è ridondante e non è consentita, ad eccezione dei casi specifici consentiti in C# 8 e versioni successive.
- Applicare il vincolo
defaultper risolvere le ambiguità con i tipi di riferimento nullable nelle implementazioni di override e di interfaccia esplicita quando si usa C# 9 o una versione successiva (CS0460). Questa eccezione alla regola di ereditarietà dei vincoli consente di specificare in modo esplicito il vincolo predefinito per disambiguare i contesti di annotazione nullable. - Specificare in modo esplicito vincoli su
where T : classowhere T : structper i metodi di override e implementazione esplicita dell'interfaccia quando si utilizza C# 8 o versione successiva per abilitare le annotazioni dei tipi di riferimento nullable (CS0460). Questi vincoli specifici possono supportare l'analisi dei tipi di riferimento nullabili sui parametri di tipo vincolati ai tipi di riferimento o di valore.
Per altre informazioni, vedere Vincoli su parametri di tipo, interfacce e tipi riferimento Nullable.
Visibilità e modificatori dei metodi
Gli errori seguenti si verificano quando si implementano metodi di interfaccia con accessibilità o modificatori non corretti:
- CS0736: il membro non implementa il membro dell'interfaccia dell'istanza. Non può implementare il membro dell'interfaccia perché è statico.
- CS0737: il membro non implementa il membro dell'interfaccia. Non può implementare un membro di interfaccia perché non è pubblico.
È possibile correggere questi errori usando le tecniche seguenti:
- Rimuovere il
staticmodificatore dalla dichiarazione del metodo che implementa il membro dell'interfaccia (CS0736). Prima di C# 10, i membri dell'interfaccia sono membri dell'istanza, non membri statici. - Aggiungere il
publicmodificatore di accesso al metodo che implementa il membro dell'interfaccia (CS0737). Tutti i membri dell'interfaccia sono implicitamentepublicperché le interfacce definiscono un contratto per il comportamento pubblico, pertanto il metodo di implementazione deve disporre anche dell'accessibilità pubblica per essere accessibile tramite il riferimento all'interfaccia.
Per altre informazioni, vedere Interfacce e modificatori di accesso.
Implementazione e conflitti delle funzioni di accesso
Gli errori seguenti si verificano durante l'implementazione di proprietà o eventi dell'interfaccia con metodi di accesso con problemi di visibilità o conflitti di denominazione:
- CS0277: Il membro non implementa il membro dell'interfaccia perché quest'ultimo non è pubblico.
- CS0470: il metodo non può implementare la funzione di accesso dell'interfaccia per il tipo. Usare un'implementazione esplicita dell'interfaccia.
- CS0686: La funzione di accesso non può implementare il membro dell'interfaccia. Usare un'implementazione esplicita dell'interfaccia.
È possibile correggere questi errori usando le tecniche seguenti:
- Rimuovere i modificatori di accesso dagli accessori di proprietà che limitano la visibilità a una visibilità inferiore rispetto a
public, o aggiungere il modificatorepublicse manca (CS0277). Tutti i membri dell'interfaccia sono implicitamentepublic, pertanto la funzione di accesso che implementa deve avere anche accessibilità pubblica per soddisfare il contratto di interfaccia ed essere accessibile tramite il tipo di interfaccia. - Sostituire i metodi con nomi simili ad accessori (ad esempio
get_PropertyName) con una sintassi di proprietà appropriata mediante l'uso dell'implementazione esplicita dell'interfaccia (CS0470). Il compilatore genera metodi di accesso internamente per le proprietà e tenta di creare manualmente metodi con questi nomi riservati è in conflitto con il meccanismo di implementazione della proprietà. - Usare la sintassi esplicita di implementazione dell'interfaccia per risolvere i conflitti di denominazione quando l'interfaccia contiene nomi di metodi che corrispondono ai metodi della funzione di accesso generati automaticamente (CS0686). Il compilatore genera automaticamente metodi come
get_Propertyeset_Propertyper le proprietà eadd_Eventremove_Eventper gli eventi, quindi se un'interfaccia dichiara metodi con questi nomi esatti, è necessaria un'implementazione esplicita per disambiguare tra il metodo di interfaccia e la funzione di accesso generata dal compilatore.
Per altre informazioni, vedere Interfacce, proprietà ed eventi.
Implementazioni ambigue e in conflitto
Gli errori seguenti si verificano quando il compilatore non riesce a determinare quale implementazione dell'interfaccia usare:
- CS0473: l'implementazione esplicita dell'interfaccia 'nome metodo' corrisponde a più di un membro dell'interfaccia. Quale membro di interfaccia viene effettivamente scelto è dipendente dall'implementazione. Prendere invece in considerazione l'uso di un'implementazione non esplicita.
- CS8705: il membro di interfaccia 'member' non ha un'implementazione più specifica. Nessuno dei due è più specifico.
È possibile correggere questi errori usando le tecniche seguenti:
- Eliminare l'implementazione esplicita dell'interfaccia e usare invece una singola implementazione pubblica implicita per entrambi i metodi di interfaccia (CS0473). Quando un metodo generico acquisisce la stessa firma di un metodo non generico ,ad esempio quando si implementa
ITest<int>dove eTestMethod(int)TestMethod(T)diventa identico, il sistema di metadati dell'infrastruttura del linguaggio comune non può determinare in modo univoco quale membro dell'interfaccia associa a quale slot di implementazione, quindi l'uso dell'implementazione implicita consente al singolo metodo di soddisfare entrambi i requisiti dell'interfaccia. - Fornire un'implementazione esplicita nella classe o nello struct di implementazione che risolve l'ambiguità tra più implementazioni predefinite (CS8705). Questo errore si verifica in genere con modelli di ereditarietà a rombo in cui una classe implementa più interfacce che forniscono implementazioni predefinite per lo stesso membro. Il compilatore deve specificare in modo esplicito l'implementazione da usare o fornire la propria implementazione.
- Ristrutturare la gerarchia di interfaccia per evitare conflitti di ereditarietà a rombo in cui più interfacce forniscono implementazioni predefinite per lo stesso membro (CS8705). Riprogettando le relazioni di interfaccia o consolidando le implementazioni predefinite in una singola interfaccia, è possibile eliminare l'ambiguità che impedisce al compilatore di determinare l'implementazione più specifica.
Per altre informazioni, vedere Interfacce e metodi di interfaccia predefiniti.
Restrizioni di implementazione speciali
L'errore seguente si verifica quando si usano tipi di parametri speciali non compatibili con l'implementazione dell'interfaccia:
- CS0630: il membro non può implementare il membro dell'interfaccia perché ha un parametro __arglist.
È possibile correggere questo errore usando le tecniche seguenti:
- Rimuovere il
__arglistparametro dal metodo di implementazione (CS0630). La__arglistparola chiave consente ai metodi di accettare numeri variabili di argomenti in modo non gestito, ma questa funzionalità non è compatibile con l'implementazione dell'interfaccia perché i contratti di interfaccia richiedono firme prevedibili e indipendenti dai tipi che possono essere verificate in fase di compilazione. - Sostituire il
__arglistparametro con unparamsparametro di matrice per gli elenchi di argomenti a lunghezza variabile (CS0630). A differenza di__arglist, la parola chiaveparamsfornisce un meccanismo sicuro per i tipi per accettare un numero variabile di argomenti che è pienamente compatibile con l'implementazione dell'interfaccia e mantiene la sicurezza dei tipi in fase di compilazione richiesta dalle interfacce.
Per altre informazioni, vedere Interfacce e parole chiave params.