Condividi tramite


È possibile risolvere gli errori e gli avvisi nelle dichiarazioni di matrici e raccolte nonché nelle espressioni di inizializzazione

Questo articolo illustra gli errori del compilatore seguenti:

  • CS0022: numero di indici errato in [], previsto 'number'
  • CS0178: identificatore di classificazione non valido: previsto ',' o ']'
  • CS0248: non è possibile creare una matrice con dimensioni negative
  • CS0270: non è possibile specificare la dimensione della matrice in una dichiarazione di variabile. Provare a inizializzare con un'espressione 'new'
  • CS0611: gli elementi di una matrice non possono essere di tipo type
  • CS0623: gli inizializzatori di matrice possono essere usati solo in un inizializzatore di campo o di variabile. Provare a utilizzare un'espressione nuova.
  • CS0650: dichiaratore di matrice non valido: per dichiarare una matrice gestita, l'identificatore di classificazione precede l'identificatore della variabile. Per dichiarare un campo buffer a dimensione fissa, usare la parola chiave fixed prima del tipo di campo.
  • CS0719: gli elementi matrice non possono essere di tipo statico
  • CS0747: dichiaratore di membro di inizializzatore non valido.
  • CS0820: non è possibile assegnare l'inizializzatore di matrice a una variabile locale tipizzata in modo implicito
  • CS0826: nessun tipo migliore trovato per una matrice tipizzata in modo implicito.
  • CS0846: è previsto un inizializzatore di matrice annidato
  • CS1063: il miglior metodo Add di overload per l'elemento inizializzatore di raccolta è obsoleto.
  • CS1552: identificatore del tipo di matrice, [], deve essere visualizzato prima del nome del parametro
  • CS1586: la creazione della matrice deve avere la dimensione della matrice o l'inizializzatore della matrice
  • CS1920: l'inizializzatore di elemento non può essere vuoto.
  • CS1921: la corrispondenza migliore del metodo di overload ha una firma errata dell'elemento inizializzatore. Il Add inizializzabile deve essere un metodo di istanza accessibile.
  • CS1925: non è possibile inizializzare l'oggetto di tipo 'type' con un inizializzatore di raccolta.
  • CS1950: il miglior metodo Add di overload per l'inizializzatore di raccolta presenta alcuni argomenti non validi.
  • CS1954: non è possibile usare la corrispondenza migliore del metodo di overload per l'elemento dell'inizializzatore di raccolta. I metodi dell'inizializzatore di raccolta 'Add' non possono avere parametri ref o out.
  • CS9174: non è possibile inizializzare il tipo con un valore letterale di raccolta perché il tipo non è constructible.
  • CS9176: non esiste alcun tipo di destinazione per il valore letterale della raccolta.
  • CS9185: il tipo di compilazione CollectionBuilderAttribute deve essere una classe o uno struct non generico.
  • CS9186: il nome del metodo CollectionBuilderAttribute non è valido.
  • CS9187: non è possibile trovare un metodo accessibile con la firma prevista: un metodo statico con un parametro singolo di tipo ReadOnlySpan<T> e il tipo restituito corretto
  • CS9188: Type ha un CollectionBuilderAttribute ma nessun tipo di elemento.
  • CS9203: un'espressione di raccolta di questo tipo non può essere usata in questo contesto perché potrebbe essere esposta all'esterno dell'ambito corrente.
  • CS9210: questa versione di System.Collections.Immutable.ImmutableArray<T>non può essere usata con le espressioni di raccolta.

In questo articolo, sono inoltre illustrati gli avvisi seguenti:

  • CS1062: il miglior metodo Add di overload per l'elemento inizializzatore di raccolta è obsoleto.
  • CS1064: il miglior metodo Add di overload per l'elemento inizializzatore di raccolta è obsoleto.
  • CS3007: metodo di overload 'method' che differisce solo per i tipi di matrice senza nome non è conforme a CLS
  • CS3016: l'utilizzo di matrici come argomenti di attributi non è conforme a CLS
  • CS0251: indicizzazione di una matrice con un indice negativo (gli indici di matrice iniziano sempre a zero)
  • CS9208: un'espressione di raccolta può comportare allocazioni di heap impreviste. Prendere in considerazione la creazione esplicita di una matrice, quindi la conversione nel tipo finale per rendere esplicita l'allocazione.
  • CS9209: un'espressione di raccolta può comportare allocazioni heap impreviste a causa dell'uso delle espansioni di '..'. Prendere in considerazione la creazione esplicita di una matrice, quindi la conversione nel tipo finale per rendere esplicita l'allocazione.

Per altre informazioni su matrici, inizializzatori di raccolte ed espressioni di raccolta, vedere gli articoli seguenti:

Inizializzatore di raccolta non valido

Gli errori seguenti indicano che il codice generato dal compilatore per un inizializzatore di raccolta non è valido:

  • CS0747: dichiaratore di membro di inizializzatore non valido.
  • CS1063: il miglior metodo Add di overload per l'elemento inizializzatore di raccolta è obsoleto.
  • CS1920: l'inizializzatore dell'elemento non può essere vuoto.
  • CS1921: La corrispondenza migliore del metodo di overload ha una firma errata per l'elemento inizializzatore. Add inizializzabile deve essere un metodo di istanza accessibile.
  • CS1950: il miglior metodo Add di overload per l'inizializzatore di raccolta presenta alcuni argomenti non validi.
  • CS1954: non è possibile usare la corrispondenza migliore del metodo di overload per l'elemento dell'inizializzatore di raccolta. I metodi dell'inizializzatore di raccolta 'Add' non possono avere parametri ref o out.
  • CS9174: non è possibile inizializzare il tipo con un valore letterale di raccolta perché il tipo non è constructible.
  • CS9176: non esiste alcun tipo di destinazione per il valore letterale della raccolta.
  • CS9203: un'espressione di raccolta di questo tipo non può essere utilizzata in questo contesto perché potrebbe essere esposta all'esterno dell'ambito corrente.
  • CS9210: questa versione di System.Collections.Immutable.ImmutableArray<T>non può essere usata con le espressioni di raccolta.

Il compilatore potrebbe anche generare l'avviso seguente:

  • CS1062: il miglior metodo Add di overload per l'elemento inizializzatore di raccolta è obsoleto.
  • CS1064: il miglior metodo Add di overload per l'elemento inizializzatore di raccolta è obsoleto.
  • CS9208: un'espressione di raccolta può comportare allocazioni di heap impreviste. Prendere in considerazione la creazione esplicita di una matrice, quindi la conversione nel tipo finale per rendere esplicita l'allocazione.
  • CS9209: un'espressione di raccolta può comportare allocazioni heap impreviste a causa dell'uso di spread di... Prendere in considerazione la creazione esplicita di una matrice, quindi la conversione nel tipo finale per rendere esplicita l'allocazione.

Gli errori seguenti indicano che il codice generato dal compilatore per un inizializzatore di raccolta non è valido. Procedi come segue:

  • Un inizializzatore di raccolta è costituito da una sequenza di elementi. Non è possibile combinare le proprietà dell'impostazione nell'istanza della raccolta con l'aggiunta di elementi nello stesso inizializzatore.
  • Un inizializzatore di raccolta che include parentesi graffe ({ e }) non può essere vuoto.
  • La classe deve implementare IEnumerable e avere un metodo Add pubblico.
  • Un metodo conforme Add deve essere accessibile e accettare un parametro che corrisponde allo stesso tipo degli elementi della raccolta. Il parametro non può includere il modificatore ref o out.
  • La risoluzione dell'overload deve selezionare un metodo Add come corrispondenza migliore. Non possono essere presenti più metodi corrispondenti altrettanto validi.
  • Le espressioni di raccolta possono inizializzare variabili tipizzate in modo esplicito di un tipo di raccolta. Se la variabile non è un tipo di raccolta o matrice o è tipizzata in modo implicito (con var), non è possibile usare un inizializzatore di raccolta.
  • Un tipo ref struct, ad esempio System.Span<T>, non può essere inizializzato con un'espressione di raccolta che potrebbe violare la protezione dei riferimenti.
  • Un'espressione di raccolta non può inizializzare correttamente un oggetto System.Collections.Immutable.ImmutableArray<T> usando la versione corrente. Usare una versione diversa del runtime o modificare l'espressione di inizializzazione.

Gli avvisi indicano che l'espressione di raccolta, inclusi gli elementi distribuiti, potrebbe allocare memoria. La creazione di risorse di archiviazione e conversione diverse potrebbe risultare più efficiente.

Inizializzatore di matrice non valido

  • CS0623: gli inizializzatori di matrice possono essere usati solo in un inizializzatore di variabili o campi. Provare a utilizzare un'espressione nuova.
  • CS0846: è previsto un inizializzatore di matrice annidato
  • CS1925: non è possibile inizializzare l'oggetto di tipo 'type' con un inizializzatore di raccolta.

Questi errori indicano che è stato creato un inizializzatore non valido. La causa probabile è costituita da parentesi graffe { e } sbilanciate e intorno a uno o più elementi o matrici figlio. Assicurarsi che l'espressione di inizializzazione corrisponda al numero di matrici in un'inizializzazione di matrice di matrici e che le parentesi graffe siano bilanciate.

Accesso all'elemento di matrice non valido

  • CS0022: numero errato degli indici all'interno di [], previsto 'number'
  • CS0251: l'indicizzazione di una matrice con un indice negativo (gli indici di matrice iniziano sempre a zero)

È possibile accedere a un elemento di una matrice specificando l'indice per ogni asse dichiarato nella matrice. Gli indici sono compresi tra [ e ] dopo il nome della matrice. Esistono due regole per gli indici di matrice:

  1. È necessario specificare lo stesso numero di indici usati nella dichiarazione di matrice. Se la matrice ha una dimensione, occorre specificare un indice. Se la matrice ha tre dimensioni, è necessario specificare tre indici.
  2. Tutti gli indici devono essere interi non negativi.

Classificazione della matrice non valida

  • CS0178: identificatore di classificazione non valido: previsto ',' o ']'
  • CS0650: dichiaratore di matrice non valido: per dichiarare una matrice gestita, l'identificatore di classificazione deve precedere l'identificatore della variabile. Per dichiarare un campo buffer a dimensione fissa, usare la parola chiave fixed prima del tipo di campo.
  • CS1552: identificatore del tipo di matrice, [], deve essere visualizzato prima del nome del parametro

Una dichiarazione di matrice è costituita dai token seguenti, in ordine:

  1. Tipo degli elementi della matrice. Ad esempio, int, string o SomeClassType.
  2. Parentesi quadre di matrice, incluse in modo occasionale le virgole per rappresentare più dimensioni.
  3. Nome della variabile.

Quando un'inizializzazione di matrice specifica le dimensioni della matrice, è possibile specificare le proprietà seguenti:

  • Numero di elementi tra parentesi graffe ({ e })
  • Parentesi quadre vuote
  • Una o più virgole racchiuse tra parentesi quadre

Ad esempio, di seguito sono riportate dichiarazioni di matrice valide:

int[] anArrayOfIntegers;
string[,,] threeDimensionalStringArray;

Per altre informazioni, vedere la sezione Specifica C# (specifica del linguaggio C#) sugli inizializzatori di matrice.

Lunghezza della matrice non valida

  • CS0248: non è possibile creare una matrice con dimensioni negative
  • CS0270: non è possibile specificare le dimensioni della matrice in una dichiarazione di variabile (provare a inizializzare con un'espressione 'new'
  • CS1586: la creazione di matrice deve avere dimensioni della matrice o inizializzatore di matrice

La lunghezza di ogni dimensione di una matrice deve essere specificata come parte dell'inizializzazione della matrice, non come relativa dichiarazione. La lunghezza di ogni dimensione deve essere positiva. È possibile specificare la lunghezza usando un'espressione new per allocare la matrice o con un inizializzatore di matrice per assegnare tutti gli elementi. L'esempio seguente illustra entrambi i meccanismi:

int[] fiveIntegers = new int[5];
string[] weekDays = { "Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat" };

Tipo di elemento non valido

  • CS0611: gli elementi matrice non possono essere di tipo 'type'
  • CS0719: gli elementi matrice non possono essere di tipo statico
  • CS0820: non è possibile assegnare l'inizializzatore di matrice a un locale tipizzato in modo implicito
  • CS0826: nessun tipo migliore trovato per una matrice tipizzata in modo implicito.

Alcuni tipi non possono essere usati come tipo di matrice. Questi tipi includono System.TypedReference e System.ArgIterator. Il tipo di una matrice non può essere una classe static, perché non è possibile creare istanze di una classe static.

È possibile dichiarare matrici come variabili locali tipizzate in modo implicito. La matrice deve essere inizializzata usando un'espressione new. Inoltre, tutti gli elementi di un inizializzatore di matrice devono avere un tipo comune migliore. Gli esempi seguenti illustrano come dichiarare una matrice tipizzata in modo implicito:

var implicitType = new[] { 1, 2, 3 };
        
char c = 'c';
short s1 = 0;
short s2 = -0;
short s3 = 1;
short s4 = -1;

// common type is "int"
var commonType = new[] { s1, s2, s3, s4, c, 1 };

È possibile garantire il tipo comune migliore usando una delle tecniche seguenti:

  • Assegnare un tipo esplicito alla matrice.
  • Assegnare lo stesso tipo a tutti gli elementi della matrice.
  • Specificare cast espliciti per gli elementi che potrebbero causare il problema.

Generatore di raccolte non valido

Gli errori seguenti indicano errori nel tipo di generatore di raccolte:

  • CS9185: il tipo di generatore di CollectionBuilderAttribute deve essere una classe o uno struct non generico.
  • CS9186: il nome del metodo di CollectionBuilderAttribute non è valido.
  • CS9187: non è possibile trovare un metodo accessibile con la firma prevista: un metodo statico con un parametro singolo di tipo ReadOnlySpan<T> e tipo restituito corretto.
  • CS9188: Type ha un CollectionBuilderAttribute ma nessun tipo di elemento.

Questi errori indicano che occorre modificare il tipo di generatore di raccolte. Tenere presente le regole seguenti:

  • Il tipo di raccolta deve avere un tipo di iterazione. In altre parole, è possibile foreach il tipo come raccolta.
  • Il tipo di generatore di raccolte non può essere un tipo generico.
  • Il nome del metodo specificato in System.Runtime.CompilerServices.CollectionBuilderAttribute deve essere un nome di metodo valido. Ad esempio, non può essere finalizzatore o altro nome che contiene caratteri di identificatore non validi.
  • Il metodo del generatore di raccolte deve essere un metodo statico accessibile. Deve restituire il tipo di raccolta e deve accettare un parametro di ReadOnlySpan<T> dove T corrisponde al tipo di elemento della raccolta.

Avvisi relativi alle specifiche del linguaggio comune

  • CS3007: metodo di overload 'method' che differisce solo per i tipi di matrice senza nome non è conforme a CLS
  • CS3016: l'uso di matrici come argomenti di attributo non è conforme a CLS

CS3007 si verifica se si dispone di un metodo di overload che accetta una matrice frastagliata e l'unica differenza tra le firme del metodo è il tipo di elemento della matrice. Per evitare questo errore, è consigliabile usare una matrice rettangolare anziché una matrice irregolare o, se non è necessaria la conformità a CLS, rimuovere l'attributo CLSCompliantAttribute. Per altre informazioni sulla conformità a CLS, vedere Indipendenza del linguaggio e componenti indipendenti dal linguaggio.

CS3016 indica che non è conforme a Common Language Specification (CLS) per passare una matrice a un attributo. Per altre informazioni sulla conformità a CLS, vedere Indipendenza del linguaggio e componenti indipendenti dal linguaggio.