Condividi tramite


Errori e avvisi sui membri dell'interfaccia statica, astratta e virtuale

Il compilatore genera gli errori seguenti per dichiarazioni non valide di membri astratti statici o virtuali nelle interfacce:

  • CS8920: l'interfaccia non può essere usata come argomento di tipo. Il membro statico non dispone di un'implementazione più specifica nell'interfaccia .
  • CS8921: il parametro di un operatore unario deve essere il tipo contenitore o il relativo parametro di tipo vincolato.
  • CS8922: il tipo di parametro per ++ o -- operatore deve essere il tipo contenitore o il relativo parametro di tipo vincolato.
  • CS8923: il tipo restituito per ++ o -- operatore deve corrispondere al tipo di parametro oppure essere derivato dal tipo di parametro oppure essere il parametro di tipo contenitore vincolato a tale tipo, a meno che il tipo di parametro non sia un parametro di tipo diverso.
  • CS8924: uno dei parametri di un operatore binario deve essere il tipo contenitore o il relativo parametro di tipo vincolato.
  • CS8925: Il primo operando di un operatore di shift sovraccarico deve avere lo stesso tipo del tipo contenitore o un parametro di tipo vincolato ad esso
  • CS8926: è possibile accedere a un membro di interfaccia virtuale o astratta statico solo su un parametro di tipo.
  • CS8928: il tipo non implementa un membro dell'interfaccia statica. Il metodo non può implementare il membro dell'interfaccia perché non è statico.
  • CS8930: L'implementazione esplicita di un operatore definito dall'utente deve essere dichiarata statica
  • CS8931: la conversione definita dall'utente in un'interfaccia deve eseguire la conversione in o da un parametro di tipo nel tipo di inclusione vincolato al tipo di inclusione
  • CS8932: il metodo 'UnmanagedCallersOnly' non può implementare un membro dell'interfaccia nel tipo specificato
  • CS9044: il tipo non implementa il membro dell'interfaccia. Il metodo non può implementare in modo implicito un membro inaccessibile.
  • CS9046: uno dei parametri di un operatore di uguaglianza o disuguaglianza dichiarato in un'interfaccia deve essere un parametro di tipo vincolato all'interfaccia

Questi errori si verificano in tre posizioni nel codice:

Errori nella dichiarazione dell'interfaccia

Quando dichiari un'interfaccia con static abstract o static virtual membri, potresti riscontrare gli errori seguenti:

  • CS8921: il parametro di un operatore unario deve essere il tipo contenitore o il relativo parametro di tipo vincolato.
  • CS8922: il tipo di parametro per ++ o -- operatore deve essere il tipo contenitore o il relativo parametro di tipo vincolato.
  • CS8923: il tipo restituito per ++ o -- operatore deve corrispondere al tipo di parametro oppure essere derivato dal tipo di parametro oppure essere il parametro di tipo contenitore vincolato a tale tipo, a meno che il tipo di parametro non sia un parametro di tipo diverso.
  • CS8924: uno dei parametri di un operatore binario deve essere il tipo contenitore o il relativo parametro di tipo vincolato.
  • CS8925: il primo operando di un operatore di spostamento sovraccarico deve essere dello stesso tipo del tipo contenitore o deve avere un parametro di tipo vincolato ad esso
  • CS8931: la conversione definita dall'utente in un'interfaccia deve eseguire la conversione in o da un parametro di tipo nel tipo di inclusione vincolato al tipo di inclusione
  • CS9046: uno dei parametri di un operatore di uguaglianza o disuguaglianza dichiarato nell'interfaccia deve essere un parametro di tipo vincolato all'interfaccia

Per gli operatori unari dichiarati in un'interfaccia, verificare che il parametro sia il tipo di interfaccia stesso o un parametro T di tipo in cui T è vincolato a implementare l'interfaccia (CS8921). Questo vincolo garantisce che l'operatore possa essere applicato solo ai tipi che implementano l'interfaccia, consentendo al compilatore di risolvere l'implementazione corretta in fase di compilazione.

Per gli operatori di incremento (++) e decremento (--), verificare che il parametro segua le stesse regole degli altri operatori unari (CS8922). Inoltre, il tipo restituito deve corrispondere al tipo di parametro, derivarlo o essere il parametro di tipo dell'interfaccia vincolato all'interfaccia (CS8923). Queste regole assicurano che le operazioni di incremento e decremento restituiscono un tipo compatibile che può essere assegnato di nuovo alla variabile originale.

Per gli operatori binari, almeno uno dei due parametri deve essere il tipo di interfaccia contenitore o un parametro di tipo vincolato per implementare l'interfaccia (CS8924). Questo requisito consente all'altro parametro di essere qualsiasi tipo, abilitando operatori come T operator +(T left, int right) in scenari matematici generici.

Per gli operatori shift (<< e >>), il primo operando deve essere il tipo contenitore o il relativo parametro di tipo vincolato (CS8925). Il secondo operando segue le regole dell'operatore shift standard ed è in genere int.

Per gli operatori di conversione definiti dall'utente, la conversione deve includere un parametro di tipo vincolato al tipo di interfaccia contenitore (CS8931). Non è possibile definire conversioni tra tipi arbitrari in un'interfaccia; la conversione deve essere correlata ai tipi che implementano l'interfaccia.

Per gli operatori di uguaglianza (==) e disuguaglianza (!=), almeno un parametro deve essere un parametro di tipo vincolato all'interfaccia, non solo il tipo di interfaccia stesso (CS9046). Questo requisito più rigoroso per gli operatori di uguaglianza garantisce una corretta sicurezza dei tipi durante il confronto delle istanze tramite l'interfaccia .

Per altre informazioni sulle regole per le dichiarazioni di operatore nelle interfacce, vedere Membri astratti statici nelle interfacce. Per una guida pratica all'implementazione di questi modelli, vedere Esplorare i membri dell'interfaccia astratta statica.

Errori nella dichiarazione di implementazione dell'interfaccia tipo

Quando si definisce un tipo che implementa un'interfaccia con static abstract o static virtual metodi, è possibile che si verifichino gli errori seguenti:

  • CS8928: il tipo non implementa un membro dell'interfaccia statica. Il metodo non può implementare il membro dell'interfaccia perché non è statico.
  • CS8930: L'implementazione esplicita di un operatore definito dall'utente deve essere dichiarata statica
  • CS8932: il metodo 'UnmanagedCallersOnly' non può essere utilizzato per implementare un membro dell'interfaccia nel tipo
  • CS9044: il tipo non implementa il membro dell'interfaccia. Il metodo non può implementare in modo implicito un membro inaccessibile.

Quando si implementa un membro dell'interfaccia statica astratta o virtuale statica, dichiarare il metodo di implementazione usando il static modificatore (CS8928). A differenza dei membri dell'interfaccia dell'istanza implementati dai metodi di istanza, i membri astratti statici richiedono implementazioni statiche perché il runtime li richiama sul tipo stesso, non in un'istanza.

Per le implementazioni esplicite degli operatori definiti dall'utente da un'interfaccia, includere il static modificatore nell'implementazione (CS8930). Le implementazioni esplicite dell'interfaccia degli operatori seguono lo stesso requisito statico delle implementazioni implicite.

Rimuovere l'attributo System.Runtime.InteropServices.UnmanagedCallersOnlyAttribute da qualsiasi metodo che implementa un membro dell'interfaccia (CS8932). I metodi contrassegnati tramite questo attributo possono essere chiamati solo da codice non gestito e non possono partecipare all'implementazione dell'interfaccia perché il runtime deve chiamarli tramite il meccanismo di invio dell'interfaccia.

Se il metodo di implementazione ha un'accessibilità più restrittiva rispetto al membro dell'interfaccia (ad esempio, un private metodo o internal che implementa un public membro di interfaccia), usare la sintassi esplicita dell'implementazione dell'interfaccia anziché l'implementazione implicita (CS9044). L'implementazione implicita richiede che il membro di implementazione sia almeno accessibile come il membro dell'interfaccia implementato.

Per altre informazioni sull'implementazione dei membri dell'interfaccia, vedere Interfacce e implementazioneesplicita dell'interfaccia.

Errori durante la chiamata di membri dell'interfaccia astratta statica

Quando si tenta di chiamare un membro definito come membro static abstract o static virtual di un'interfaccia, è possibile che vengano visualizzati gli errori seguenti:

  • CS8920: l'interfaccia non può essere usata come argomento di tipo. Il membro statico non dispone di un'implementazione più specifica nell'interfaccia .
  • CS8926: è possibile accedere a un membro di interfaccia virtuale o astratta statico solo su un parametro di tipo.

Quando si usa un'interfaccia con membri astratti statici come argomento di tipo, assicurarsi che tutti i membri astratti statici abbiano un'implementazione più specifica disponibile (CS8920). Questo errore viene visualizzato quando il compilatore non riesce a determinare quale implementazione usare, in genere perché più gerarchie di interfaccia forniscono implementazioni predefinite in conflitto o nessuna implementazione esistente.

Accedere ai membri dell'interfaccia virtuale statica astratta o statica tramite un parametro di tipo vincolato all'implementazione dell'interfaccia, anziché direttamente tramite il tipo di interfaccia (CS8926). Ad esempio, usare T.MemberName dove T è vincolato da where T : IMyInterface, anziché IMyInterface.MemberNameda . Il compilatore richiede un tipo concreto per risolvere l'implementazione da chiamare e un parametro di tipo vincolato fornisce tale tipo concreto in fase di compilazione tramite la specializzazione generica.

Per altre informazioni sull'accesso a membri astratti statici, vedere Membri astratti statici nelle interfacce.