Condividi tramite


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, o System.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: foreachl'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, volatileo readonly.

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, o System.Range.
  • CS9173: un accesso a una matrice potrebbe non avere un identificatore di argomento denominato
  • CS9189: foreachl'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 o System.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 un Span<T>scrivibile. È invece possibile usare ReadOnlySpan<T>.
  • Il contesto sicuro della matrice inline deve essere almeno largo quanto il contesto sicuro di Span<T> o ReadOnlySpan<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.