Risolvere gli errori e gli avvisi con dichiarazioni di matrice inline
Questo articolo illustra gli errori e gli avvisi del compilatore seguenti:
- CS9164: impossibile convertire l'espressione in
Span<T>
perché non è una variabile assegnabile - CS9165: impossibile convertire l'espressione in
ReadOnlySpan<T>
perché potrebbe non essere passata o restituita dal riferimento - CS9166: l'indice non rientra nei limiti della matrice inline
- CS9167: la lunghezza della matrice inline deve essere maggiore di 0.
- CS9168: lo struct matrice inline non deve avere un layout esplicito.
- CS9169: lo struct matrice inline deve dichiarare uno e un solo campo di istanza che non deve essere un campo di riferimento.
- CS9172: è possibile accedere agli elementi di un tipo di matrice inline solo con un singolo argomento convertibile in modo implicito in
int
,System.Index
, oSystem.Range
. - CS9173: un accesso a una matrice potrebbe non avere un identificatore di argomento denominato
- CS9180: il campo dell'elemento matrice inline non può essere dichiarato come obbligatorio, readonly, volatile o come buffer a dimensione fissa.
- CS9181: l'indicizzatore di matrici inline non verrà usato per l'espressione di accesso agli elementi.
- CS9182: il metodo 'Slice' della matrice inline non verrà usato per l'espressione di accesso agli elementi.
- CS9183: l'operatore di conversione di matrici inline non verrà usato per la conversione dall'espressione del tipo dichiarante.
- CS9184: la funzionalità del linguaggio 'Matrici inline' non è supportata per i tipi di matrice inline con campo elemento che è un campo '
ref
' o ha un tipo non valido come argomento di tipo. - CS9189:
foreach
l'istruzione in una matrice inline di tipo non è supportata
Dichiarazione di matrice inline
Si dichiarano matrici inline come tipo struct
con un singolo campo e un attributo che specifica la lunghezza della matrice. Il compilatore genera gli errori seguenti per dichiarazioni di matrice inline non valide:
- CS9167: la lunghezza della matrice inline deve essere maggiore di 0.
- CS9168: lo struct matrice inline non deve avere un layout esplicito.
- CS9169: lo struct matrice inline deve dichiarare uno e un solo campo di istanza che non deve essere un campo di riferimento.
- CS9180: il campo dell'elemento matrice inline non può essere dichiarato come obbligatorio, readonly, volatile o come buffer a dimensione fissa.
- CS9184: la funzionalità del linguaggio 'Matrici inline' non è supportata per i tipi di matrice inline con campo elemento che è un campo '
ref
' o ha un tipo non valido come argomento di tipo.
Per correggere queste matrici, verificare che siano soddisfatte le condizioni seguenti:
- L'argomento di System.Runtime.CompilerServices.InlineArrayAttribute è un numero intero positivo.
- L'inclusione
struct
non specifica alcun layout esplicito. - L'inclusione
struct
include un campo a istanza singola e il campo dell'istanza non è un camporef
. - Il campo a istanza singola non è un buffer a dimensione fissa.
- Il campo a istanza singola non include i modificatori
required
,volatile
oreadonly
.
Accesso a elementi
È possibile accedere agli elementi di una matrice inline nello stesso modo di qualsiasi matrice. Il compilatore genera gli errori seguenti dall'accesso non corretto agli elementi:
- CS9166: l'indice non rientra nei limiti della matrice inline
- CS9172: è possibile accedere agli elementi di un tipo di matrice inline solo con un singolo argomento convertibile in modo implicito in
int
,System.Index
, oSystem.Range
. - CS9173: un accesso a una matrice potrebbe non avere un identificatore di argomento denominato
- CS9189:
foreach
l'istruzione in una matrice inline di tipo non è supportata
Inoltre, il compilatore genera l'avviso seguente quando si dichiara un indicizzatore:
- CS9181: l'indicizzatore di matrici inline non verrà usato per l'espressione di accesso agli elementi.
Il codice generato per un buffer inline accede direttamente alla memoria del buffer, ignorando gli indicizzatori dichiarati. Non è possibile usare matrici inline con l'istruzione foreach
.
L'argomento dell'indicizzatore deve essere:
- Uno di questi tre tipi:
int
,System.Index
oSystem.Range
. - Non può essere un argomento denominato. Il compilatore genera la funzione di accesso dell'elemento. Il parametro non ha un nome, quindi non è possibile usare argomenti denominati.
- È incluso nei limiti della matrice. Analogamente a tutte le matrici .NET, l'accesso agli elementi della matrice inline è controllato. L'indice deve trovarsi all'interno dei limiti della matrice inline.
Conversioni in Span
Spesso si usa System.Span<T> o System.ReadOnlySpan<T> per lavorare con matrici inline. Il compilatore genera gli errori seguenti per le conversioni non valide:
- CS9164: impossibile convertire l'espressione in
Span<T>
perché non è una variabile assegnabile - CS9165: impossibile convertire l'espressione in
ReadOnlySpan<T>
perché potrebbe non essere passata o restituita dal riferimento
Il compilatore genera codice che accede direttamente alla memoria per un buffer inline. Di conseguenza, alcuni membri non vengono mai chiamati. Il compilatore genera gli avvisi seguenti se si scrive uno dei membri che non vengono mai chiamati:
- CS9182: il metodo 'Slice' della matrice inline non verrà usato per l'espressione di accesso agli elementi.
- CS9183: l'operatore di conversione di matrici inline non verrà usato per la conversione dall'espressione del tipo dichiarante.
Una matrice inline può essere convertita in modo implicito in un Span<T>
o ReadOnlySpan<T>
per passare una matrice inline ai metodi. Il compilatore applica restrizioni a tali conversioni:
- La matrice inline deve essere scrivibile per convertire una matrice inline in un oggetto
Span<T>
. Se la matrice è di sola lettura, non è possibile convertirla in unSpan<T>
scrivibile. È invece possibile usareReadOnlySpan<T>
. - Il contesto sicuro della matrice inline deve essere almeno largo quanto il contesto sicuro di
Span<T>
oReadOnlySpan<T>
affinché la conversione abbia esito positivo. È necessario limitare il contesto dell'intervallo oppure espandere l'ambito della matrice inline.
Inoltre, il compilatore non genera mai chiamate a un metodo Slice
in un buffer inline. Gli operatori di conversione per convertire un buffer inline in un Span
o ReadOnlySpan
non vengono chiamati. Il compilatore genera codice per creare un System.Span<T> o un System.ReadOnlySpan<T> direttamente dal buffer di memoria.