Condividi tramite


Risolvere gli errori e gli avvisi nei costrutti di codice non sicuri

Questo articolo illustra gli errori del compilatore seguenti:

  • CS0193: l'operatore * o -> deve essere applicato a un puntatore dati
  • CS0196: un puntatore deve essere indicizzato da un solo valore
  • CS0208: Impossibile ottenere l'indirizzo, le dimensioni o dichiarare un puntatore a un tipo gestito ('tipo')
  • CS0209: il tipo di locale dichiarato in un'istruzione fissa deve essere un tipo di puntatore
  • CS0210: è necessario fornire un inizializzatore in una dichiarazione fissa o using di istruzione
  • CS0211: Impossibile accettare l'indirizzo dell'espressione specificata
  • CS0212: è possibile accettare solo l'indirizzo di un'espressione senza prefisso all'interno di un inizializzatore di istruzioni fisse
  • CS0213: Non è possibile usare l'istruzione 'fixed' per ottenere l'indirizzo di un'espressione già fissa
  • CS0214: i puntatori e i buffer a dimensione fissa possono essere usati solo in un contesto non sicuro
  • CS0227: Il codice unsafe può apparire solo se compilato con /unsafe
  • CS0233: 'identifier' non ha una dimensione predefinita, pertanto sizeof può essere usato solo in un contesto non sicuro
  • CS0242: l'operazione in questione non è definita sui puntatori void
  • CS0244: né 'is' né 'as' sono validi per i tipi di puntatore
  • CS0254: il lato destro di un'assegnazione di istruzione fissa potrebbe non essere un'espressione cast
  • CS0459: Impossibile accettare l'indirizzo di una variabile locale di sola lettura
  • CS0821: Le variabili locali tipizzate in modo implicito non possono essere corrette
  • CS1641: un campo buffer a dimensione fissa deve avere l'identificatore delle dimensioni della matrice dopo il nome del campo
  • CS1642: i campi del buffer a dimensione fissa possono essere solo membri di struct.
  • CS1656: Impossibile assegnare a 'variable' perché è un tipo di variabile di sola lettura
  • CS1663: il tipo di buffer a dimensione fissa deve essere uno dei seguenti: bool, byteshortintlong, char, sbyteushortuintulong, o floatdouble
  • CS1665: i buffer a dimensione fissa devono avere una lunghezza maggiore di zero
  • CS1666: non è possibile usare buffer a dimensione fissa contenuti in espressioni senza prefisso. Provare a usare l'istruzione fixed.
  • CS1708: è possibile accedere ai buffer a dimensione fissa solo tramite variabili locali o campi
  • CS1716: non usare l'attributo 'System.Runtime.CompilerServices.FixedBuffer'. Usare invece il modificatore di campo 'fixed'.
  • CS1919: impossibile usare il tipo non sicuro 'type name' nella creazione di oggetti.
  • CS4004: Impossibile await in un contesto non sicuro
  • CS8812: impossibile convertire &Method il gruppo in un tipo di puntatore non a funzione.
  • CS9123: l'operatore '&' non deve essere usato nei parametri o nelle variabili locali nei metodi asincroni.

Operazioni del puntatore e dereferenziazione

  • CS0193: l'operatore * o -> deve essere applicato a un puntatore dati
  • CS0196: un puntatore deve essere indicizzato da un solo valore
  • CS0242: l'operazione in questione non è definita sui puntatori void

Per usare correttamente le operazioni del puntatore, seguire le regole per la dereferenziazione, l'indicizzazione e le operazioni aritmetiche. Per altre informazioni, vedere Tipi di puntatore e puntatori a funzione.

  • Applicare l'operatore * o -> solo ai puntatori dati (CS0193). Non usare questi operatori con tipi non puntatore o con puntatori a funzione. I puntatori a funzione non possono essere dereferenziati in C#, a differenza di C/C++.
  • Puntatori all'indice con un solo valore (CS0196). L'indicizzazione multidimensionale non è supportata nei puntatori.
  • Evitare operazioni non predefinite sui puntatori void (CS0242). Ad esempio, non incrementare un puntatore void perché il compilatore non conosce la dimensione dei dati a cui punta.

Tipi di puntatore e tipi gestiti

  • CS0208: impossibile accettare l'indirizzo di , ottenere le dimensioni o dichiarare un puntatore a un tipo gestito ('type')
  • CS0233: 'identifier' non ha una dimensione predefinita, pertanto sizeof può essere usato solo in un contesto non sicuro

Per usare correttamente i puntatori e l'operatore sizeof , usare tipi non gestiti e contesti appropriati. Per altre informazioni, vedere Tipi non gestiti e l'operatoresizeof .

  • Usare puntatori solo con tipi non gestiti (CS0208). Non prendere l'indirizzo di, non calcolare le dimensioni di, o dichiarare puntatori ai tipi gestiti. I tipi gestiti includono tipi di riferimento e struct che contengono campi o proprietà di tipo riferimento.
  • Usare l'operatore sizeof all'interno di un unsafe contesto quando si usano tipi le cui dimensioni non sono una costante in fase di compilazione (CS0233).

Buffer fissi

  • CS0209: il tipo di locale dichiarato in un'istruzione fissa deve essere un tipo di puntatore
  • CS0210: è necessario fornire un inizializzatore in una dichiarazione fissa o using di istruzione
  • CS0211: Impossibile accettare l'indirizzo dell'espressione specificata
  • CS0212: è possibile accettare solo l'indirizzo di un'espressione senza prefisso all'interno di un inizializzatore di istruzioni fisse
  • CS0213: Non è possibile usare l'istruzione fixed per prendere l'indirizzo di un'espressione già fissata
  • CS0254: il lato destro di un'assegnazione di istruzione fissa potrebbe non essere un'espressione cast
  • CS0459: Impossibile accettare l'indirizzo di una variabile locale di sola lettura
  • CS0821: Le variabili locali tipizzate in modo implicito non possono essere corrette
  • CS1656: Impossibile assegnare a 'variable' perché è un tipo di variabile di sola lettura

Questi errori si verificano quando si usa l'istruzionefixed in modo non corretto. L'istruzione fixed impedisce al Garbage Collector di spostare una variabile mobile e dichiara un puntatore a tale variabile. Per altre informazioni, vedere Codice e puntatori unsafe.

Per usare correttamente l'istruzione fixed :

  • Dichiarare la variabile come tipo di puntatore (CS0209).
  • Specificare un inizializzatore nella dichiarazione dell'istruzione fixed (CS0210).
  • Prendere l'indirizzo solo per espressioni valide: campi, variabili locali e indirezione del puntatore (CS0211). Non prendere l'indirizzo delle espressioni calcolate come la somma di due variabili.
  • Usare l'operatore address-of su espressioni non fisse solo all'interno dell'inizializzatore di dichiarazione fixed (CS0212).
  • Non usare un'istruzione fixed nelle espressioni già fisse (CS0213). Le variabili e i parametri locali in un unsafe metodo sono già fissi nello stack.
  • Non usare espressioni di cast sul lato destro di un'assegnazione di istruzione fixed (CS0254).
  • Non prendere l'indirizzo delle variabili locali a sola lettura (CS0459). Le variabili nei foreach cicli, nelle using istruzioni e nelle fixed istruzioni sono di sola lettura.
  • Usare tipi espliciti anziché var in fixed istruzioni (CS0821).
  • Non attribuire a variabili in contesti di sola lettura come foreach cicli, using dichiarazioni o fixed istruzioni (CS1656).

Restrizioni di contesto non sicure

  • CS0214: i puntatori e i buffer a dimensione fissa possono essere usati solo in un contesto non sicuro
  • CS0227: Il codice unsafe può essere visualizzato solo se viene compilato con /unsafe
  • CS0244: né 'is' né 'as' sono validi per i tipi di puntatore
  • CS1919: Impossibile usare il tipo non sicuro 'type name' nella creazione di oggetti
  • CS4004: Impossibile attendere in un contesto non sicuro
  • CS9123: L'operatore '&' non deve essere usato nei parametri o nelle variabili locali nei metodi asincroni

Questi errori si verificano quando si usano costrutti di codice non sicuri senza contesto non sicuro appropriato o quando si tentano operazioni non consentite nel codice non sicuro. Per ulteriori informazioni, vedere Codice non sicuro e puntatori e la parola chiave unsafe.

Per usare correttamente il codice unsafe:

  • Contrassegnare metodi, tipi o blocchi di codice che usano puntatori o buffer a dimensione fissa con la unsafe parola chiave (CS0214).
  • Abilitare l'opzione del compilatore AllowUnsafeBlocks nelle impostazioni del progetto quando si usa la unsafe parola chiave (CS0227).
  • Non usare gli operatori is o as con tipi di puntatore (CS0244). Questi operatori di test dei tipi non sono validi per i puntatori.
  • Non usare l'operatore new per creare istanze del tipo di puntatore (CS1919). Per creare oggetti in memoria non gestita, usare l'interoperabilità per chiamare metodi nativi che restituiscono puntatori.
  • Mantenere il codice unsafe separato dal codice asincrono (CS4004). Creare metodi separati per le operazioni non sicure e chiamarli da metodi asincroni.
  • Non usare l'operatore address-of (&) nei parametri o nelle variabili locali nei metodi asincroni (CS9123). La variabile potrebbe non esistere al termine dell'operazione asincrona.

Buffer a dimensione fissa

  • CS1641: un campo buffer a dimensione fissa deve avere l'identificatore delle dimensioni della matrice dopo il nome del campo
  • CS1642: i campi del buffer a dimensione fissa possono essere solo membri di struct
  • CS1663: il tipo di buffer a dimensione fissa deve essere uno dei seguenti: bool, byte, short, int, long, char, sbyte, ushort, uint, ulong, float o double
  • CS1665: i buffer a dimensione fissa devono avere una lunghezza maggiore di zero
  • CS1666: non è possibile usare buffer a dimensione fissa contenuti in espressioni senza prefisso. Provare a usare l'istruzione fixed
  • CS1708: è possibile accedere ai buffer a dimensione fissa solo tramite variabili locali o campi
  • CS1716: non usare l'attributo 'System.Runtime.CompilerServices.FixedBuffer'. Usare invece il modificatore di campo 'fixed'

Questi errori si verificano quando si lavora con buffer a dimensione fissa. I buffer a dimensione fissa sono matrici incorporate direttamente negli struct e vengono usate principalmente per gli scenari di interoperabilità. Per altre informazioni, vedere Buffer a dimensione fissa.

Per dichiarare e usare correttamente buffer a dimensione fissa:

  • Specificare le dimensioni della matrice dopo il nome del campo usando una costante integer positivo (CS1641, CS1665).
  • Dichiarare buffer a dimensione fissa solo in struct, non nelle classi (CS1642). Usare un array regolare se è necessario il campo in una classe.
  • Usare uno dei tipi di elemento supportati: bool, byteshort, , int, long, charsbyteushortuintulongfloat, o double (CS1663).
  • Usare un'istruzione fixed per fissare la struct contenitore prima di accedere al buffer (CS1666).
  • Accedere ai buffer a dimensione fissa solo tramite variabili locali o campi, non tramite espressioni intermedie (CS1708).
  • Usare il fixed modificatore di campo anziché l'attributo System.Runtime.CompilerServices.FixedBuffer (CS1716).

Puntatori di funzione

  • CS8812: Impossibile convertire &Method il gruppo in un tipo di puntatore non a funzione

Per ottenere un puntatore a funzione, usare l'operatore address-of con un cast esplicito del tipo di puntatore a funzione. Non utilizzare l'operatore address-of & per assegnare gruppi di metodi a void* o ad altri tipi che non siano puntatori a funzione. Per altre informazioni, vedere Puntatori a funzioni.