Resolver erros e avisos em declarações de matriz e coleção e expressões de inicialização

Este artigo aborda os seguintes avisos do compilador:

  • CS0022: número errado de índices dentro de [], o esperado é "número"
  • CS0178: especificador de classificação inválido: o esperado é "," ou "]"
  • CS0248: não é possível criar uma matriz com um tamanho negativo
  • CS0270: o tamanho da matriz não pode ser especificado em uma declaração de variável (tente inicializar com uma expressão "new")
  • CS0611: os elementos da matriz não podem ser do tipo
  • CS0623: inicializadores de matriz só podem ser usados em uma variável ou inicializador de campo. Em vez disso, tente usar uma nova expressão.
  • CS0650:declarador de matriz inválido: para declarar uma matriz gerenciada, o especificador de classificação precede o identificador da variável. Para declarar um campo de buffer de tamanho fixo, use a palavra-chave fixed antes do tipo de campo.
  • CS0719: os elementos de matriz não podem ser do tipo estático
  • CS0747: declarador de membro do inicializador inválido.
  • CS0820: não é possível atribuir o inicializador de matriz a um local de tipo implícito
  • CS0826: nenhum melhor tipo encontrado para a matriz de tipo implícito.
  • CS0846: um inicializador de matriz aninhada é esperado
  • CS1552: o especificador de tipo de matriz, [], deve aparecer antes do nome do parâmetro
  • CS1586: a criação da matriz deve ter o tamanho da matriz ou o inicializador da matriz
  • CS1920: o inicializador de elementos não pode estar vazio.
  • CS1921: a melhor correspondência de método sobrecarregado tem assinatura incorreta para o elemento inicializador. O inicializável Add deve ser um método de instância acessível.
  • CS1925: não é possível inicializar o objeto do tipo "type" com um inicializador de coleção.
  • CS1954: não é possível usar o melhor método sobrecarregado para o elemento inicializador de coleção. Métodos de inicializador de coleção "Add" não podem ter os parâmetros ref ou out.
  • CS9174: não é possível inicializar o tipo com um literal de coleção porque o tipo não é construível.
  • CS9176: não há nenhum tipo de destino para o literal da coleção.
  • CS9185: o tipo de construtor CollectionBuilderAttribute deve ser uma classe ou struct não genéricos.
  • CS9186: o nome do método CollectionBuilderAttribute é inválido.
  • CS9187: não foi possível encontrar um método acessível com a assinatura esperada: um método estático com um único parâmetro de tipo ReadOnlySpan<T>; e o tipo de retorno correto
  • CS9188: o tipo tem um CollectionBuilderAttribute, mas nenhum tipo de elemento.
  • CS9203: uma expressão de coleção desse tipo não pode ser usada nesse contexto porque pode ser exposta fora do escopo atual.
  • CS9210: esta versão de System.Collections.Immutable.ImmutableArray<T>não pode ser usada com expressões de coleção.

Além disso, os seguintes avisos são abordados neste artigo:

  • CS3007: o método "method" sobrecarregado diferente apenas por tipos de matriz sem nome não é compatível com CLS
  • CS3016: matrizes como argumentos de atributo não são compatíveis com CLS
  • CS0251: indexar uma matriz com um índice negativo (índices de matriz sempre começam em zero)
  • CS9208:a expressão de coleção pode incorrer em alocações de heap inesperadas. Considere criar explicitamente uma matriz e converter para o tipo final para tornar a alocação explícita.
  • CS9209: a expressão de coleção pode incorrer em alocações de heap inesperadas devido ao uso de spreads "..". Considere criar explicitamente uma matriz e converter para o tipo final para tornar a alocação explícita.

Você pode saber mais sobre matrizes, inicializadores de coleção e expressões de coleção nos seguintes artigos:

Inicializador de coleção inválido

Os erros a seguir indicam que o código gerado pelo compilador para um inicializador de coleção é inválido:

  • CS0747: declarador de membro do inicializador inválido.
  • CS1920: o inicializador de elementos não pode estar vazio.
  • CS1921: a melhor correspondência de método sobrecarregado tem assinatura incorreta para o elemento inicializador. O inicializável Add deve ser um método de instância acessível.
  • CS1954: não é possível usar o melhor método sobrecarregado para o elemento inicializador de coleção. Métodos de inicializador de coleção "Add" não podem ter os parâmetros ref ou out.
  • CS9174: não é possível inicializar o tipo com um literal de coleção porque o tipo não é construível.
  • CS9176: não há nenhum tipo de destino para o literal da coleção.
  • CS9203: uma expressão de coleção desse tipo não pode ser usada nesse contexto porque pode ser exposta fora do escopo atual.
  • CS9210: esta versão de System.Collections.Immutable.ImmutableArray<T>não pode ser usada com expressões de coleção.

O compilador também pode gerar o seguinte aviso:

  • CS9208:a expressão de coleção pode incorrer em alocações de heap inesperadas. Considere criar explicitamente uma matriz e converter para o tipo final para tornar a alocação explícita.
  • CS9209: a expressão de coleção pode incorrer em alocações de heap inesperadas devido ao uso de spreads "..". Considere criar explicitamente uma matriz e converter para o tipo final para tornar a alocação explícita.

Todos os erros indicam que o código gerado pelo compilador para um inicializador de coleção é inválido. Confira o seguinte:

  • Um inicializador de coleção contém uma sequência de elementos. Não é possível misturar as propriedades de configuração na instância de coleção com a adição de elementos no mesmo inicializador.
  • Um inicializador de coleção que inclui chaves ({ e }) não pode estar vazio.
  • Um método Add em conformidade deve ser acessível e usar um parâmetro que seja do mesmo tipo que os elementos da coleção. O parâmetro não pode incluir o modificador ref ou out.
  • A resolução de sobrecarga deve escolher um método Add como uma correspondência melhor. Não pode haver vários métodos correspondentes que sejam igualmente bons.
  • As expressões de coleção podem inicializar variáveis explicitamente tipada de um tipo de coleção. Se a variável não for um tipo de coleção ou matriz ou estiver implicitamente tipada (usando var), um inicializador de coleção não poderá ser usado.
  • Um tipo ref struct, como System.Span<T>, não pode ser inicializado com uma expressão de coleção que possa violar a segurança de referência.
  • Uma expressão de coleção não pode inicializar um System.Collections.Immutable.ImmutableArray<T> corretamente uma versão atual. Use uma versão diferente do runtime ou altere a expressão de inicialização.

Os avisos indicam que a expressão de coleção, incluindo todos os elementos de propagação, pode alocar memória. Criar armazenamento e conversão diferentes pode ser mais eficiente.

Inicializador de matriz inválido

  • CS0623: inicializadores de matriz só podem ser usados em uma variável ou inicializador de campo. Em vez disso, tente usar uma nova expressão.
  • CS0846: um inicializador de matriz aninhada é esperado
  • CS1925: não é possível inicializar o objeto do tipo "type" com um inicializador de coleção.

Esses erros indicam que você criou um inicializador inválido. A causa provável são chaves desbalanceadas { e } em torno de um ou mais elementos ou matrizes filhas. Verifique se a expressão de inicialização corresponde ao número de matrizes em uma inicialização de matriz irregular e se as chaves estão balanceadas.

Acesso inválido ao elemento de matriz

  • CS0022: número errado de índices dentro de [], o esperado é "número"
  • CS0251: indexar uma matriz com um índice negativo (índices de matriz sempre começam em zero)

Você acessa um elemento de uma matriz especificando o índice para cada eixo declarado na matriz. Os índices estão entre [ e ] após o nome da matriz. Há duas regras para os índices de matriz:

  1. Você deve especificar o mesmo número de índices usados na declaração de matriz. Se a matriz tiver uma dimensão, você deverá especificar um índice. Se a matriz tiver três dimensões, você deverá especificar três índices.
  2. Todos os índices devem ser inteiros não negativos.

Classificação de matriz inválida

  • CS0178: especificador de classificação inválido: o esperado é "," ou "]"
  • CS0650:declarador de matriz inválido: para declarar uma matriz gerenciada, o especificador de classificação precede o identificador da variável. Para declarar um campo de buffer de tamanho fixo, use a palavra-chave fixed antes do tipo de campo.
  • CS1552: o especificador de tipo de matriz, [], deve aparecer antes do nome do parâmetro

Uma declaração de matriz consiste nos seguintes tokens, em ordem:

  1. O tipo dos elementos da matriz. Por exemplo, int, string ou SomeClassType.
  2. Os colchetes de matriz, opcionalmente incluindo vírgulas para representar várias dimensões.
  3. O nome da variável.

Quando uma inicialização de matriz especifica as dimensões da matriz, você pode especificar as seguintes propriedades:

  • Vários elementos em chaves ({ e })
  • Colchetes vazios
  • Uma ou mais vírgulas entre parênteses

Por exemplo, estas são declarações de matriz válidas:

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

Para obter mais informações, consulte a seção Especificação de C# (Especificação da linguagem C#) em inicializadores de matriz.

Comprimento de matriz inválido

  • CS0248: não é possível criar uma matriz com um tamanho negativo
  • CS0270: o tamanho da matriz não pode ser especificado em uma declaração de variável (tente inicializar com uma expressão "new"
  • CS1586: a criação da matriz deve ter o tamanho da matriz ou do inicializador da matriz

O comprimento de cada dimensão de uma matriz deve ser especificado como parte da inicialização da matriz, não sua declaração. O comprimento de cada dimensão deve ser positivo. Você pode especificar o comprimento usando uma expressão new para alocar a matriz ou usando um inicializador de matriz para atribuir todos os elementos. O exemplo a seguir mostra ambos os mecanismos:

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

Tipo de elemento inválido

  • CS0611: os elementos da matriz não podem ser do tipo "type"
  • CS0719: os elementos da matriz não podem ser de tipo estático
  • CS0820: não é possível atribuir o inicializador de matriz a um local de tipo implícito
  • CS0826: nenhum melhor tipo encontrado para matriz de tipo implícito.

Há alguns tipos que não podem ser usados como o tipo de uma matriz. Esses tipos incluem System.TypedReference e System.ArgIterator. O tipo de uma matriz não pode ser uma classe static, porque instâncias de uma classe static não podem ser criadas.

Você pode declarar matrizes como variáveis locais implicitamente tipadas. A matriz deve ser inicializada usando uma expressão new. Além disso, todos os elementos em um inicializador de matriz devem ter um melhor tipo comum. Os exemplos a seguir mostram como declarar uma matriz tipada implicitamente:

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 };

Você pode garantir o melhor tipo comum usando qualquer uma das seguintes técnicas:

  • Forneça um tipo explícito à matriz.
  • Forneça o mesmo tipo a todos os elementos da matriz.
  • Forneça conversões explícitas sobre os elementos que podem estar causando o problema.

Construtor de coleções inválido

Os seguintes erros indicam erros no tipo do construtor de coleções:

  • CS9185:o tipo de construtor CollectionBuilderAttribute deve ser uma classe ou struct não genérico.
  • CS9186: o nome do método CollectionBuilderAttribute é inválido.
  • CS9187: não foi possível encontrar um método acessível com a assinatura esperada: um método estático com um único parâmetro de tipo ReadOnlySpan<T>; e o tipo de retorno correto.
  • CS9188: o tipo tem um CollectionBuilderAttribute, mas nenhum tipo de elemento.

Esses erros indicam que o tipo do construtor de coleções precisa de modificação. Lembre-se das seguintes regras:

  • O tipo de coleção deve ter um tipo de iteração. Em outras palavras, você pode foreach o tipo como uma coleção.
  • O tipo de construtor de coleção não pode ser um tipo genérico.
  • O nome do método especificado em System.Runtime.CompilerServices.CollectionBuilderAttribute deve ser um nome de método válido. Por exemplo, ele não pode ser finalizador ou outro nome que contenha caracteres de identificador inválidos.
  • O método do construtor de coleções deve ser um método estático acessível. Ele deve retornar o tipo de coleção e deve usar um parâmetro de ReadOnlySpan<T> em que T corresponde ao tipo de elemento da coleção.

Avisos de especificação de idioma comum

  • CS3007: o método "method" sobrecarregado diferente apenas por tipos de matriz sem nome não é compatível com CLS
  • CS3016: matrizes como argumentos de atributo não são compatíveis com CLS

O CS3007 ocorre se você tiver um método sobrecarregado que usa uma matriz irregular e a única diferença entre as assinaturas de método é o tipo de elemento da matriz. Para evitar esse erro, considere usar uma matriz retangular em vez de uma matriz irregular ou, se a conformidade CLS não for necessária, remova o atributo CLSCompliantAttribute. Para obter mais informações sobre a conformidade com CLS, confira Independência de linguagem e componentes independentes da linguagem.

O CS3016 indica que não é compatível com a Common Language Specification (CLS) para passar uma matriz para um atributo. Para obter mais informações sobre conformidade com CLS, consulte Independência de Linguagem e Componentes Independentes da Linguagem.