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.
Quando si violano le regole di sicurezza delle variabili di riferimento, è possibile generare gli errori seguenti:
-
CS8166: non è possibile restituire un parametro per riferimento perché non è un parametro
ref. -
CS8167: non è possibile restituire per riferimento un membro del parametro perché non è un parametro
refoout. - CS8168: non è possibile restituire una variabile locale per riferimento perché non è una variabile locale ref.
- CS8169: non è possibile restituire un membro della variabile locale per riferimento perché non è una variabile locale ref.
-
CS8345: il campo o la proprietà implementata automaticamente non può essere di tipo a meno che non sia un membro di istanza di un oggetto
ref struct. -
CS8351: i rami di un operatore condizionale
refnon possono fare riferimento a variabili con ambiti di dichiarazione incompatibili. - CS8374: non è possibile assegnare un valore ref perché l'origine ha un ambito di escape più ristretto rispetto a quello di destinazione.
- CS9075: Impossibile restituire un parametro per riferimento perché è limitato al metodo corrente
- CS9076: Impossibile restituire per riferimento un membro del parametro perché ha come ambito il metodo corrente
-
CS9077: non è possibile restituire un parametro per riferimento tramite un parametro
ref. Può essere restituito solo in un'istruzione return. -
CS9078: non è possibile restituire per riferimento un membro del parametro tramite un parametro
ref. Può essere restituito solo in un'istruzione return. - CS9079: Impossibile assegnare tramite riferimento l'origine alla destinazione perché l'origine può uscire dal metodo corrente solo tramite un'istruzione 'return'.
- CS9096: impossibile assegnare l'origine alla destinazione perché l'origine ha un ambito di escape di valore più ampio rispetto alla destinazione che consente l'assegnazione tramite destinazione di valori con ambiti di escape più stretti rispetto all'origine.
Quando si violano le regole di sicurezza delle variabili di riferimento vengono generati gli avvisi seguenti:
- CS9080: l'uso di variabile in questo contesto può esporre variabili a cui si fa riferimento all'esterno dell'ambito di dichiarazione
- CS9081: un risultato di un'espressione stackalloc di tipo in questo contesto può essere esposta all'esterno del metodo contenitore
- CS9082: Local viene restituito per riferimento, ma è stato inizializzato in un valore che non può essere restituito dal riferimento
- CS9083: un membro viene restituito dal riferimento, ma è stato inizializzato in un valore che non può essere restituito dal riferimento
- CS9084: il membro della struttura restituisce 'this' o altri membri dell'istanza come riferimento
- CS9085: Questa operazione assegna la sorgente alla destinazione, ma la sorgente ha un ambito di escape più ristretto rispetto alla destinazione.
- CS9086: i rami dell'operatore condizionale ref fanno riferimento a variabili con ambiti di dichiarazione incompatibili
-
CS9087: restituisce un parametro per riferimento, ma non è un parametro
ref. - CS9088: restituisce un parametro per riferimento, ma ha come ambito il metodo corrente
-
CS9089: restituisce per riferimento un membro del parametro che non è un parametro
refoout. - CS9090: restituisce per riferimento un membro del parametro con ambito al metodo corrente
- CS9091: restituisce una variabile locale per riferimento, ma non è una variabile locale ref.
- CS9092: restituisce un membro della variabile locale per riferimento, ma non è una variabile locale ref.
- CS9093: Questo riferimento assegna la sorgente alla destinazione, ma la sorgente può uscire dal metodo corrente solo tramite un'istruzione di ritorno.
-
CS9094: restituisce un parametro per riferimento tramite un parametro
ref, ma può essere restituito in modo sicuro solo in un'istruzione return. -
CS9095: restituisce per riferimento un membro del parametro tramite un parametro
ref, ma può essere restituito in modo sicuro solo in un'istruzione return. - CS9097: Questa assegnazione per riferimento associa la sorgente alla destinazione, ma la sorgente ha un ambito di validità del valore più ampio rispetto alla destinazione, consentendo l'assegnazione alla destinazione di valori con un ambito di validità più ristretto rispetto alla sorgente.
Restituzione di riferimenti con ambiti incompatibili
Il compilatore impedisce di restituire un riferimento a una variabile quando la durata della variabile non si estende oltre l'ambito del metodo. Questi errori si verificano quando si tenta di restituire facendo riferimento a un parametro, a una variabile locale o a un membro che non è dichiarato con ref o ha un ambito limitato al metodo corrente.
Errori:
-
CS8166: non è possibile restituire un parametro per riferimento perché non è un parametro
ref. -
CS8167: non è possibile restituire per riferimento un membro del parametro perché non è un parametro
refoout. - CS8168: non è possibile restituire una variabile locale per riferimento perché non è una variabile locale ref.
- CS8169: non è possibile restituire un membro della variabile locale per riferimento perché non è una variabile locale ref.
- CS9075: Impossibile restituire un parametro per riferimento perché è limitato al metodo corrente
- CS9076: Impossibile restituire per riferimento un membro del parametro perché ha come ambito il metodo corrente
-
CS9077: non è possibile restituire un parametro per riferimento tramite un parametro
ref. Può essere restituito solo in un'istruzione return. -
CS9078: non è possibile restituire per riferimento un membro del parametro tramite un parametro
ref. Può essere restituito solo in un'istruzione return.
Warnings (Avvisi):
-
CS9087: restituisce un parametro per riferimento, ma non è un parametro
ref. - CS9088: restituisce un parametro per riferimento, ma ha come ambito il metodo corrente
-
CS9089: restituisce per riferimento un membro del parametro che non è un parametro
refoout. - CS9090: Questo restituisce per riferimento un membro di un parametro che ha un ambito limitato al metodo corrente
- CS9091: restituisce una variabile locale per riferimento, ma non è una variabile locale ref.
- CS9092: restituisce un membro della variabile locale per riferimento, ma non è una variabile locale ref.
-
CS9094: restituisce un parametro per riferimento tramite un parametro
ref, ma può essere restituito in modo sicuro solo in un'istruzione return. -
CS9095: restituisce per riferimento un membro del parametro tramite un parametro
ref, ma può essere restituito in modo sicuro solo in un'istruzione return.
Per risolvere questi errori:
- Modificare la firma del metodo per dichiarare i parametri con la
refparola chiave anziché passarli per valore, che consente di restituire in modo sicuro il percorso di archiviazione del parametro perché il chiamante controlla la durata della variabile (CS8166, CS8167, CS9087, CS9089). - Per le variabili locali, dichiarale come
reflocali assegnandole da un'espressione che restituisce ref o da un parametro ref, il che garantisce che la variabile locale faccia riferimento alla memoria con una durata sufficiente anziché creare una nuova variabile con durata limitata al metodo (CS8168, CS8169, CS9091, CS9092). - Quando un parametro viene dichiarato con il modificatore
scoped, si dovrebbe evitare di restituirlo come riferimento perché il modificatorescopedlimita esplicitamente il parametro dall'essere utilizzato al di fuori del metodo, impedendo potenziali riferimenti pendenti (CS9075, CS9076, CS9088, CS9090). - Se è necessario restituire un riferimento proveniente da un
refparametro, usare un'istruzione diretta anziché assegnare il riferimento a un altroreturn refparametro e restituirlo, perché il compilatore può tenere traccia solo dell'ambito di escape tramite istruzioni return diretteref(CS9077, CS9078, CS9094, CS9095).
Per ulteriori informazioni sulle regole di sicurezza dei reference, consultare l'articolo sui ritorni di reference e la sezione standard C# sui contesti sicuri di reference.
Assegnazioni di reference con ambiti incompatibili
Il compilatore impedisce operazioni di assegnazione di riferimento in cui la variabile di origine ha un ambito di escape più ristretto rispetto alla destinazione. Un'assegnazione di riferimento crea un collegamento dalla posizione di destinazione a quella di archiviazione dell'origine. Se l'origine esce dall'ambito di applicazione prima della destinazione, la destinazione farebbe riferimento a memoria non valida.
Errori:
- CS8374: non è possibile assegnare un valore ref perché l'origine ha un ambito di escape più ristretto rispetto a quello di destinazione.
- CS9079: non è possibile assegnare un valore ref dall'origine alla destinazione perché l'origine può eseguire l'escape solo del metodo corrente tramite un'istruzione return.
- CS9096: non è possibile assegnare un valore ref dall'origine alla destinazione perché l'origine ha un ambito di escape del valore più ampio rispetto a quello di destinazione consentendo l'assegnazione tramite la destinazione di valori con ambiti di escape più ristretti rispetto a quelli di origine.
Warnings (Avvisi):
- CS9085: assegna un valore ref dall'origine alla destinazione ma l'origine ha un ambito di escape più ristretto rispetto a quello di destinazione.
- CS9093: assegna un valore ref dall'origine alla destinazione ma l'origine può eseguire l'escape solo del metodo corrente tramite un'istruzione return.
- CS9097: assegna un valore ref dall'origine alla destinazione ma l'origine ha un ambito di escape del valore più ampio rispetto a quello di destinazione consentendo l'assegnazione tramite la destinazione di valori con ambiti di escape più ristretti rispetto a quelli di origine.
Per risolvere questi errori:
- Ristrutturare il codice in modo che la variabile di origine in un'assegnazione di riferimento abbia un ambito di escape almeno quanto la variabile di destinazione, che garantisce che il riferimento di destinazione rimanga valido per l'intera durata e impedisca riferimenti incerti (CS8374, CS9085).
- Quando una variabile può lasciare il metodo solo attraverso un'istruzione return, non assegnarla a variabili
refaccessibili tramite altri mezzi. Gli esempi includono l'archiviazione nei campi o la restituzione tramite parametri di riferimento. Tali azioni violano la restrizione che la fonte può essere usata solo nelle istruzioni di ritorno (CS9079, CS9093). - Per le assegnazioni di riferimento che coinvolgono ambiti di escape dei valori, assicurarsi che l'ambito di escape del valore di origine non sia più ampio di quello della destinazione, perché una mancata corrispondenza consente di assegnare valori con ambito più ristretto tramite il riferimento di destinazione, creando potenzialmente riferimenti a valori di breve durata (CS9096, CS9097).
Per altre informazioni sulle regole di sicurezza di riferimento, vedere l'articolo sui ritorni di riferimento e la sezione standard C# sui contesti sicuri di riferimento.
Violazioni dell'ambito di escape e operatori condizionali
Il compilatore tiene traccia del modo in cui le variabili possono eseguire l'escape dell'ambito di dichiarazione tramite varie operazioni. Questi errori si verificano quando si usano variabili nei contesti che potrebbero esporre variabili a cui si fa riferimento al di fuori della durata valida, inclusi gli operatori condizionali ref e le espressioni stackalloc.
Errori:
-
CS8351: i rami di un operatore condizionale
refnon possono fare riferimento a variabili con ambiti di dichiarazione incompatibili.
Warnings (Avvisi):
- CS9080: l'uso di variabile in questo contesto può esporre variabili a cui si fa riferimento all'esterno dell'ambito di dichiarazione
- CS9081: un risultato di un'espressione stackalloc di tipo in questo contesto può essere esposta all'esterno del metodo contenitore
- CS9086: i rami dell'operatore condizionale ref fanno riferimento a variabili con ambiti di dichiarazione incompatibili.
Per risolvere questi errori:
- Modificare l'operatore condizionale ref (l'operatore
?:conrefrestituisce) in modo che i rami true e false facciano riferimento a variabili con ambiti di dichiarazione compatibili, il che significa che entrambe le variabili devono avere durate che si estendono almeno allo stesso livello di ambito, impedendo all'espressione condizionale di restituire potenzialmente un riferimento che non è valido (CS8351, CS9086). - Quando si usano variabili nelle espressioni o nelle chiamate al metodo, assicurarsi che il contesto non consenta alle variabili di riferimento di eseguire un escape oltre il relativo ambito di dichiarazione, evitando in genere di passare variabili con ambito a metodi o espressioni in cui potrebbero essere acquisiti o archiviati oltre la durata prevista (CS9080).
- Per le espressioni stackalloc, evitare di assegnare il risultato alle variabili o di usarlo nei contesti in cui è possibile accedere alla memoria allo stack allocata all'esterno del metodo contenitore, perché la memoria allocata allo stack viene liberata automaticamente quando il metodo restituisce e accedervi in seguito comporta un comportamento non definito (CS9081).
Per altre informazioni, vedere l'articolo sui ritorni di riferimento, l'articolo sull'utilizzo della memoria e la sezione standard C# sui contesti sicuri di riferimento.
Restrizioni sui membri e campi delle struct
Il compilatore applica regole speciali per i membri e i campi dello struct per evitare riferimenti incerti. Questi errori si verificano quando i membri dello struct restituiscono riferimenti allo stato dell'istanza o quando i campi hanno tipi che richiedono una gestione speciale.
Errori:
-
CS8345: un campo o una proprietà implementata automaticamente non può essere di tipo a meno che non sia un membro di istanza di un valore
ref struct.
Warnings (Avvisi):
- CS9082: Local viene restituito per riferimento, ma è stato inizializzato in un valore che non può essere restituito dal riferimento
- CS9083: un membro viene restituito dal riferimento, ma è stato inizializzato in un valore che non può essere restituito dal riferimento
- CS9084: il membro Struct restituisce 'this' o altri membri dell'istanza per riferimento
Per risolvere questi errori:
- Assicurarsi che i campi e le proprietà auto-implementate con tipi ref-like (ad esempio tipi
Span<T>oref struct) siano dichiarati solo come membri dell'istanza all'interno di un ref struct anziché in normali struct o classi, perché i tipi ref-like possono esistere solo in modo sicuro nello stack e i ref struct forniscono le garanzie di durata necessarie (CS8345). - Quando si restituisce una variabile locale per riferimento da un metodo, verificare che la variabile locale sia stata inizializzata da un'origine con ambito di escape sufficiente, ad esempio un parametro ref o una chiamata al metodo che restituisce ref, anziché da un'espressione tipizzata di valore o da una variabile con ambito locale che creerebbe un riferimento all'archiviazione di breve durata (CS9082, CS9083).
- Nel contesto dei metodi o delle proprietà di istanza di struct, evitare di restituire
thiso qualsiasi campo di istanza per riferimento, perché gli struct sono tipi di valore che vengono spesso copiati e restituire un riferimento a un membro dell'istanza potrebbe creare un riferimento a una copia temporanea che viene eliminata dopo che il metodo restituisce (CS9084).
Per ulteriori informazioni, vedere l'articolo sui tipi di struct di riferimento e la sezione dello standard C# sui contesti di riferimento sicuri.