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 e gli avvisi del compilatore seguenti:
- CS0059: accessibilità incoerente: il tipo di parametro 'type' è meno accessibile del delegato 'delegate'.
- CS0123: nessun sovraccarico per 'method' non corrisponde al delegato 'delegate'.
- CS0148: Il delegate 'delegato' non dispone di un costruttore valido.
- CS0410: nessun overload per 'method' ha il parametro corretto e i tipi restituiti.
- CS0644: 'class' non può derivare dalla classe speciale 'class'.
- CS1599: il tipo restituito di un metodo, un delegato o un puntatore a funzione non può essere 'type'.
- CS1958: Le espressioni di inizializzatore oggetto e raccolta non possono essere applicate a un'espressione di creazione di un delegato.
- CS8755: 'modificatore' non può essere usato come modificatore in un parametro del puntatore a funzione.
- CS8756: il puntatore a funzione 'type' non accetta argomenti 'count'.
- CS8757: Nessun sovraccarico per 'metodo' corrisponde al puntatore a funzione 'tipo'.
- CS8758: mancata corrispondenza di riferimento tra 'method' e puntatore a funzione 'type'.
- CS8759: impossibile creare un puntatore a funzione per 'method' perché non è un metodo statico.
- CS8786: La convenzione di chiamata di 'convention' non è compatibile con 'convention'.
- CS8787: impossibile convertire il gruppo di metodi in puntatore a funzione. (Manca un '&'?)
- CS8788: impossibile usare un metodo di estensione con un ricevitore come destinazione di un operatore '&'.
- CS8789: il tipo di un'istruzione locale dichiarata in un'istruzione fissa non può essere un tipo di puntatore a funzione.
- CS8806: la convenzione di chiamata "convention" non è supportata dalla lingua.
- CS8807: 'specifier' non è un identificatore di convenzione di chiamata valido per un puntatore a funzione.
- CS8808: 'modificatore' non è un modificatore del tipo di ritorno del puntatore a funzione valido. I modificatori validi sono 'ref' e 'ref readonly'.
- CS8809: un tipo restituito può avere un solo modificatore 'modificatore'.
- CS8811: impossibile convertire il gruppo di metodi 'method' nel tipo delegato 'type'.
- CS8909: il confronto dei puntatori a funzione potrebbe produrre un risultato imprevisto, poiché i puntatori alla stessa funzione possono essere distinti.
- CS8911: l'uso di un tipo di puntatore a funzione in questo contesto non è supportato.
Delegare la mancata corrispondenza della firma
- CS0059: accessibilità incoerente: il tipo di parametro 'type' è meno accessibile del delegato 'delegate'.
- CS0123: nessun overload di 'method' corrisponde al delegato 'delegate'.
- CS0148: Il delegato 'delegate' non ha un costruttore valido.
- CS0410: Nessun overload per il metodo presenta i tipi corretti di parametri e di ritorno.
Quando si crea o si assegna un delegato, il compilatore verifica che la firma del metodo di destinazione corrisponda alla dichiarazione del tipo delegato. La firma include i tipi di parametro, il tipo restituito e l'accessibilità. Per le regole complete, vedere Delegati e vincoli di accessibilità nella specifica C#.
- Modificare tutti i tipi di parametro nella dichiarazione del delegato in tipi accessibili almeno come il delegato stesso (CS0059). Un
publicdelegato non può fare riferimento a un tipo meno accessibile nel relativo elenco di parametri perché i chiamanti esterni all'assembly non sarebbero in grado di fornire l'argomento. Per altre informazioni, vedere Modificatori di accesso. - Modificare la firma del metodo o la firma del delegato in modo che i tipi di parametro e il tipo restituito corrispondano esattamente (CS0123). Il compilatore richiede una corrispondenza esatta della firma quando si assegna un metodo a un delegato.
- Verificare che il delegato sia stato compilato da un compilatore conforme (CS0148). Questo errore si verifica quando si importa un assembly gestito compilato da un compilatore che ha generato un costruttore delegato non valido. Ricompilare l'assembly con un compilatore conforme agli standard per risolvere l'errore.
Note
CS0410 non viene più prodotto dal compilatore C# corrente. La stessa condizione genera ora CS0123. Gli assembly meno recenti compilati con i compilatori precedenti potrebbero comunque fare riferimento a questo codice di errore.
CS0148 è un errore diagnostico valido solo in fase di compilazione:
Note
Questo avviso viene segnalato solo durante le operazioni di compilazione o ricompilazione esplicite. Non viene visualizzato durante la digitazione nell'IDE come parte della diagnostica di IntelliSense. Ciò significa che se si corregge l'avviso usando il campo o rimuovendolo, l'avviso potrebbe persistere nell'elenco degli errori fino a quando non si compila o si ricompila nuovamente il progetto.
Restrizioni sui tipi di delegato
- CS0644: 'class' non può derivare dalla classe speciale 'class'.
- CS1599: il tipo restituito di un metodo, un delegato o un puntatore a funzione non può essere 'type'.
- CS1958: Le espressioni di inizializzazione dell'oggetto e della raccolta potrebbero non essere applicate a un'espressione di creazione del delegato.
Il linguaggio C# limita il modo in cui è possibile usare determinati tipi speciali, tra cui System.Delegate. Per le regole complete sulle dichiarazioni di delegato, vedere Delegati e delegati nella specifica C#.
- Rimuovere la classe base esplicita e usare invece una
delegatedichiarazione (CS0644). Le classi non possono ereditare in modo esplicito daSystem.Delegate,System.Enum,System.ValueTypeoSystem.Array. Il compilatore usa questi tipi come classi di base implicite. Ad esempio, ognidelegatedichiarazione deriva in modo implicito daSystem.Delegate. - Modificare il tipo di valore restituito con uno che sia consentito come valore restituito (CS1599). Alcuni tipi nella libreria di classi .NET, ad esempio TypedReference, RuntimeArgumentHandle e ArgIterator, non possono essere usati come tipi restituiti per metodi, delegati o puntatori a funzione perché possono potenzialmente abilitare operazioni dello stack non sicure.
- Rimuovere le parentesi graffe dopo l'espressione di creazione del delegato (CS1958). I delegati non dispongono di membri che è possibile impostare tramite la sintassi dell'inizializzatore dell'oggetto o della raccolta. Se hai
{ }dopo un'espressionenew DelegateType(method), rimuovi la parentesi graffa.
Disallineamenti nella firma del puntatore a funzione
- CS8755: 'modificatore' non può essere usato come modificatore su un parametro di puntatore a funzione.
- CS8756: il puntatore a funzione 'type' non accetta argomenti 'count'.
- CS8757: Nessun sovraccarico per il metodo 'method' corrisponde al puntatore a funzione 'type'.
- CS8758: mancata corrispondenza di riferimento tra 'method' e puntatore a funzione 'type'.
- CS8759: impossibile creare un puntatore a funzione per 'method' perché non è un metodo statico.
- CS8787: impossibile convertire il gruppo di metodi in puntatore a funzione. (Manca un '&'?)
- CS8788: impossibile usare un metodo di estensione con un ricevitore come destinazione di un operatore '&'.
- CS8811: impossibile convertire il gruppo di metodi 'method' nel tipo delegato 'type'.
Quando si assegna un metodo a un puntatore a funzione usando l'operatore address-of (&), il compilatore verifica che la firma del metodo corrisponda al tipo di puntatore di funzione. Per le regole complete sulle dichiarazioni e sull'utilizzo del puntatore di funzione, vedere Puntatori di funzione e codice non sicuro.
- Rimuovere il modificatore non supportato dal parametro del puntatore di funzione (CS8755). I parametri del puntatore di funzione supportano solo i modificatori
ref,outein. Altri modificatori di parametri, ad esempioparams, non sono validi nelle dichiarazioni di tipo puntatore a funzione. - Modificare il numero di argomenti nel sito di chiamata in modo che corrisponda al conteggio dei parametri del puntatore di funzione (CS8756). Il tipo di puntatore di funzione definisce un numero fisso di parametri, e devi passare esattamente quel numero di argomenti.
- Modificare la firma del metodo in modo che i tipi di parametro, il tipo restituito e il conteggio dei parametri corrispondano al tipo di puntatore di funzione (CS8757). A differenza dei delegati, i puntatori a funzione non supportano conversioni implicite tra signature di metodi compatibili. La corrispondenza deve essere esatta.
- Allinea i modificatori
ref,outoinfra i parametri del metodo e i parametri del tipo di puntatore a funzione (CS8758). Il tipo di riferimento di ogni parametro deve corrispondere esattamente. Unrefparametro non può soddisfare una posizioneinooutnel tipo di puntatore di funzione. - Modificare il metodo di destinazione in
static(CS8759). I puntatori a funzione possono puntare solo ai metodi statici perché rappresentano indirizzi di funzione non elaborati senza un'istanza dell'oggetto associata. - Aggiungere l'operatore
&prima del gruppo di metodi durante l'assegnazione a un puntatore a funzione (CS8787). A differenza dei delegati, i puntatori a funzione richiedono l'operatore address-of esplicito:delegate*<void> ptr = &MyMethod;. - Usare un metodo statico anziché un metodo di estensione con un ricevitore (CS8788). L'operatore
&richiede un riferimento al metodo diretto. I metodi di estensione chiamati in un'istanza hanno un ricevitore implicito che non può essere acquisito in un puntatore a funzione. - Rimuovere l'operatore
&e usare invece la sintassi del delegato, oppure modificare il tipo di destinazione da un delegato a un puntatore per funzione (CS8811). L'operatore&produce un puntatore a funzione, non un delegato. Per assegnare un gruppo di metodi a un tipo delegato, omettere il&e usare la sintassi standard per la creazione del delegato.
Convenzioni di chiamata del puntatore a funzione e tipi restituiti
- CS8786: La convenzione di chiamata di 'convention' non è compatibile con 'convention'.
- CS8806: la convenzione di chiamata "convention" non è supportata dalla lingua.
- CS8807: 'specifier' non è un identificatore di convenzione di chiamata valido per un puntatore a funzione.
- CS8808: 'modificatore' non è un modificatore valido per il tipo di ritorno di un puntatore a funzione. I modificatori validi sono 'ref' e 'ref readonly'.
- CS8809: Un tipo di ritorno può avere un solo modificatore 'modificatore'.
Le dichiarazioni dei puntatori di funzione includono una convenzione di chiamata e modificatori opzionali del tipo di ritorno. Il compilatore convalida queste opzioni. Per le regole complete, vedere Puntatori a funzioni.
- Modificare la convenzione di chiamata del metodo o la convenzione di chiamata del tipo di puntatore di funzione in modo che corrispondano (CS8786). Quando si assegna un metodo a un puntatore a funzione, le convenzioni di chiamata devono essere compatibili. Ad esempio, un metodo che usa
Cdeclnon può essere assegnato a un puntatore di funzione dichiarato conStdcall. - Usare una convenzione di chiamata supportata nella dichiarazione del puntatore di funzione (CS8806). Il linguaggio supporta
managedeunmanaged. Per una convenzione non gestita specifica, usare launmanagedparola chiave con la convenzione tra parentesi quadre, ad esempiounmanaged[Cdecl],unmanaged[Stdcall]unmanaged[Thiscall], ounmanaged[Fastcall]. - Sostituire l'identificatore non valido con una convenzione di chiamata supportata (CS8807). Usare
managed,unmanagedounmanagedcon un tipo di convenzione di chiamata tra parentesi quadre (ad esempio,unmanaged[Cdecl]). - Usare solo
reforef readonlycome modificatore di tipo restituito (CS8808). Altri modificatori, ad esempiooutoin, non sono validi per i tipi di ritorno del puntatore a funzione. - Rimuovere il modificatore duplicato del tipo di ritorno in modo che venga visualizzato solo uno
reforef readonly(CS8809). Il compilatore consente al massimo un modificatore del tipo di ritorno in una dichiarazione di puntatore a funzione.
Restrizioni di utilizzo del puntatore di funzione
- CS8789: Il tipo di una variabile locale dichiarata in un'istruzione fixed non può essere un tipo di puntatore a funzione.
- CS8909: il confronto dei puntatori a funzione potrebbe produrre un risultato imprevisto, poiché i puntatori alla stessa funzione possono essere distinti.
- CS8911: l'uso di un tipo di puntatore a funzione in questo contesto non è supportato.
Il compilatore limita il modo in cui i tipi di puntatore a funzione possono essere usati in determinati contesti. Per le regole complete, vedere Puntatori a funzioni.
- Modificare il tipo di variabile locale nell'istruzione
fixedimpostando un tipo di puntatore dati anziché un tipo di puntatore a funzione (CS8789). L'istruzionefixedblocca gli oggetti gestiti in memoria per l'accesso ai dati. I puntatori a funzione rappresentano indirizzi di codice, non dati e non possono essere bloccati. - Evitare di confrontare i puntatori di funzione per l'uguaglianza (CS8909). Questo avviso indica che il confronto dei puntatori di funzione con
==o!=potrebbe produrre risultati imprevisti. Il runtime potrebbe restituire puntatori diversi per la stessa funzione a causa di dettagli di implementazione, come il thunking o la compilazione JIT. Per eliminare l'avviso quando si conferma che il confronto è intenzionale, usare#pragma warning disable CS8909. - Spostare l'utilizzo del puntatore della funzione in un contesto supportato (CS8911). I tipi di puntatore di funzione non possono essere usati in determinate posizioni, ad esempio come argomenti di attributo o nelle espressioni
typeof. Ristrutturare il codice per evitare di usare tipi di puntatore a funzione in contesti non supportati.