Partilhar via


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

Este artigo aborda os seguintes erros do compilador:

  • CS0022: Número errado de índices dentro de [], 'número' esperado
  • CS0178: Especificador de classificação inválido: 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 de matriz não podem ser do tipo
  • CS0623: Os inicializadores de matriz só podem ser usados em um inicializador de variável ou campo. Em vez disso, tente usar uma nova expressão.
  • CS0650: Declarador de matriz incorreta: 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 inicializador inválido.
  • CS0820: Não é possível atribuir inicializador de matriz a um local digitado implicitamente
  • CS0826: Nenhum melhor tipo encontrado para matriz digitada implicitamente.
  • CS0846: Um inicializador de matriz aninhada é esperado
  • CS1063: O melhor método Add sobrecarregado para o elemento inicializador da coleção está obsoleto.
  • CS1552: O especificador de tipo de matriz, [], deve aparecer antes do nome do parâmetro
  • CS1586: A criação de matriz deve ter tamanho de matriz ou inicializador de matriz
  • CS1920: O inicializador de elementos não pode estar vazio.
  • CS1921: A melhor correspondência de método sobrecarregado tem assinatura errada para o elemento inicializador. O inicializável Add deve ser um método de instância acessível.
  • CS1925: Não é possível inicializar objeto do tipo 'tipo' com um inicializador de coleção.
  • CS1950: O melhor método Add sobrecarregado para o inicializador de coleção tem alguns argumentos inválidos.
  • CS1954: A melhor correspondência de método sobrecarregado para o elemento inicializador da coleção não pode ser usada. Os métodos do inicializador de coleção 'Add' não podem ter ref parâmetros OR 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 de coleção.
  • CS9185: O tipo de construtor CollectionBuilderAttribute deve ser uma classe ou struct não genérica.
  • 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 do tipo ReadOnlySpan<T>e tipo de retorno correto
  • CS9188: Type tem um CollectionBuilderAttribute, mas nenhum tipo de elemento.
  • CS9203: Uma expressão de coleção desse tipo não pode ser usada neste contexto porque pode ser exposta fora do escopo atual.
  • CS9210: Esta versão do não pode ser usada com expressões de System.Collections.Immutable.ImmutableArray<T>coleção.
  • CS9212: O operador de spread '..' não pode operar em variáveis do tipo 'tipo' porque 'tipo' não contém uma instância pública ou definição de extensão para 'membro'.
  • CS9213: O destino de expressão de coleção 'type' não tem nenhum tipo de elemento.
  • CS9214: O tipo de expressão de coleção deve ter um construtor aplicável que possa ser chamado sem argumentos.
  • CS9215: O tipo de expressão de coleção 'type' deve ter uma instância ou um método de extensão 'Add' que possa ser chamado com um único argumento.
  • CS9222: O inicializador de coleção resulta em uma cadeia infinita de instanciações de 'tipo' de coleção.
  • CS9332: Não é possível usar o operador de dispersão '..' na expressão de filtro numa cláusula catch.
  • CS9354: o elemento 'with(...)' deve ser o primeiro elemento
  • CS9355:os elementos 'with(...)' não são suportados para o tipo 'type'
  • CS9356: argumentos de elementos 'with(...)' não podem ser dinâmicos
  • CS9357: o elemento 'with(...)' para uma interface de apenas leitura deve estar vazio se presente
  • CS9358: O tipo de elemento desta coleção não pode ser um ref struct nem um parâmetro de tipo que permita ref structs
  • CS9359: Não há sobrecarga para o método 'método' que aceite 'número' de argumentos do elemento 'com(...)'

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

  • CS1062: O melhor método Add sobrecarregado para o elemento inicializador da coleção está obsoleto.
  • CS1064: O melhor método Add sobrecarregado para o elemento inicializador da coleção está obsoleto.
  • CS3007: Método sobrecarregado que difere apenas por tipos de matriz sem nome não é compatível com CLS
  • CS3016: Matrizes como argumentos de atributo não é compatível com CLS
  • CS0251: Indexando 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 a criação explícita de uma matriz e, em seguida, a conversão 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 a criação explícita de uma matriz e, em seguida, a conversão para o tipo final para tornar a alocação explícita.
  • CS9332: Não é possível usar o operador de dispersão '..' na expressão de filtro numa cláusula catch.

Acesso inválido a elementos de matriz

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

Para acessar os elementos da matriz corretamente, siga estas regras de indexação. Para obter mais informações, consulte Matrizes.

  • Especifique o mesmo número de índices que as dimensões declaradas (CS0022). Uma matriz unidimensional precisa de um índice; Uma matriz tridimensional precisa de três índices.
  • Use apenas inteiros não negativos para índices de matriz (CS0251). Os índices de matriz sempre começam em zero.

Inicializador de coleção inválido

  • CS0747: Declarador de membro inicializador inválido.
  • CS1920: O inicializador de elementos não pode estar vazio.
  • CS1921: A melhor correspondência de método sobrecarregado tem assinatura errada para o elemento inicializador. O inicializável Add deve ser um método de instância acessível.
  • CS1922: Não é possível inicializar o tipo 'type' com um inicializador de coleção porque 'type' não implementa 'System.Collections.IEnumerable'.
  • CS1925: Não é possível inicializar objeto do tipo 'tipo' com um inicializador de coleção.
  • CS1927: Aviso: Ignorando /win32manifest para módulo porque ele só se aplica a assemblies
  • CS1950: O melhor método Add sobrecarregado para o inicializador de coleção tem alguns argumentos inválidos.
  • CS1954: A melhor correspondência de método sobrecarregado para o elemento inicializador da coleção não pode ser usada. Os métodos do inicializador de coleção 'Add' não podem ter ref parâmetros OR 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 de coleção.
  • CS9203: Uma expressão de coleção desse tipo não pode ser usada neste 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.
  • CS9212: O operador de spread '..' não pode operar em variáveis do tipo 'tipo' porque 'tipo' não contém uma instância pública ou definição de extensão para 'membro'.
  • CS9213: O destino da expressão de coleções 'type' não possui um tipo de elemento.
  • CS9214: O tipo de expressão de coleção deve ter um construtor aplicável que possa ser chamado sem argumentos.
  • CS9215: O tipo de expressão de coleção 'type' deve ter uma instância ou um método de extensão 'Add' que possa ser chamado com um único argumento.
  • CS9222: O inicializador de coleção resulta em uma cadeia infinita de instanciações de 'tipo' de coleção.
  • CS9332: Não é possível usar o operador de propagação '..' na expressão de filtro de uma cláusula catch.
  • CS9354: o elemento 'with(...)' deve ser o primeiro elemento
  • CS9355:os elementos 'with(...)' não são suportados para o tipo 'type'
  • CS9356: argumentos de elementos 'with(...)' não podem ser dinâmicos
  • CS9357: o elemento 'with(...)' para uma interface de apenas leitura deve estar vazio se presente
  • CS9358: O tipo de elemento desta coleção não pode ser uma ref struct nem um parâmetro de tipo que permita ref structs
  • CS9359: Não existe sobrecarga para o método 'método' que aceite 'número' argumentos de elemento 'com(...)'

O compilador também pode gerar os seguintes avisos:

  • CS1062: O melhor método Add sobrecarregado para o elemento inicializador da coleção está obsoleto.
  • CS1063: O melhor método Add sobrecarregado para o elemento inicializador da coleção está obsoleto.
  • CS1064: O melhor método Add sobrecarregado para o elemento inicializador da coleção está obsoleto.
  • CS9208: A expressão de coleção pode incorrer em alocações de heap inesperadas. Considere a criação explícita de uma matriz e, em seguida, a conversão 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 a criação explícita de uma matriz e, em seguida, a conversão para o tipo final para tornar a alocação explícita.

Para criar inicializadores de coleção válidos, siga estas regras. Para obter mais informações, consulte Expressões de coleção.

  • Não misture a inicialização da propriedade com a adição de elementos no mesmo inicializador (CS0747).
  • Inclua pelo menos um elemento nos inicializadores de coleções utilizando chaves (CS1920).
  • Certifique-se de que o tipo de coleção implementa IEnumerable (CS1922).
  • Utilize inicializadores de coleção somente com tipos de coleção (CS1925).
  • Verifique se o método Add é acessível, recebe um parâmetro correspondente ao tipo de elemento e não usa os modificadores ref ou out (CS1921, CS1954).
  • Resolver sobrecargas de método ambíguas Add (CS1950).
  • Forneça um tipo de destino explícito para expressões de coleção quando o compilador não puder inferi-lo (CS9176, CS9213).
  • Verifique se o tipo de coleção é construível com um construtor sem parâmetros (CS9174, CS9214).
  • Não use ref struct tipos em expressões de coleção que possam violar a segurança de ref (CS9203).
  • Atualize para uma versão runtime compatível com ImmutableArray expressões de coleção (CS9210).
  • Implemente padrões de enumeração (como GetEnumerator) para suporte ao operador spread (CS9212).
  • Evite dependências circulares na inicialização da coleção (CS9222).
  • Não use o operador spread em expressões de filtro de cláusula catch (CS9332).
  • Coloque o with(...) elemento primeiro nas expressões da coleção (CS9354).
  • Use with(...) elementos apenas com tipos que suportem argumentos de expressão de coleção (CS9355).
  • Não uses argumentos dinâmicos em with(...) elementos (CS9356).
  • Use campo vazio with() para tipos de interface apenas de leitura (CS9357).
  • Não uses tipos de ref struct como tipos de elemento em coleções que não os suportam (CS9358).
  • Corresponder o número de argumentos with(...) às sobrecargas de construtores disponíveis (CS9359).

Classificação de matriz inválida

  • CS0178: Especificador de classificação inválido: esperado ',' ou ']'
  • CS0650: Declarador de matriz incorreta: 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

Para declarar matrizes corretamente, siga a ordem de sintaxe adequada. Para obter mais informações, consulte Arrays e a seção C# Language Specification sobre inicializadores de matriz.

Uma declaração de matriz consiste nestes tokens em ordem:

  1. O tipo de elementos de matriz (por exemplo, int, string, ou SomeClassType).
  2. Os colchetes da matriz, incluindo opcionalmente vírgulas para múltiplas dimensões.
  3. O nome da variável.

Ao especificar dimensões de matriz, você pode usar:

  • Uma série de elementos em chaves ({ e })
  • Colchetes vazios
  • Uma ou mais vírgulas entre parênteses

Os exemplos a seguir mostram declarações de matriz válidas:

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

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 'nova')
  • CS1586: A criação de matriz deve ter tamanho de matriz ou inicializador de matriz

Para criar matrizes com comprimentos válidos, especifique o tamanho durante a inicialização, não a declaração. Para obter mais informações, consulte Matrizes.

  • Especifique o comprimento da matriz como parte da inicialização, não a declaração (CS0270).
  • Use apenas inteiros positivos para dimensões de matriz (CS0248).
  • Forneça um tamanho numa new expressão ou num inicializador de matriz (CS1586).

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 'tipo'
  • CS0719: Os elementos de matriz não podem ser do tipo estático
  • CS0820: Não é possível atribuir inicializador de matriz a um local digitado implicitamente
  • CS0826: Nenhum melhor tipo encontrado para matriz digitada implicitamente

Para usar matrizes com tipos de elementos corretos, siga estas restrições de tipo. Para obter mais informações, consulte Variáveis locais digitadas implicitamente e melhor tipo comum.

  • Não use tipos restritos como System.TypedReference e System.ArgIterator como tipos de elementos de matriz (CS0611).
  • Não use static classes como tipos de elementos de matriz porque as instâncias não podem ser criadas (CS0719).
  • Inicialize matrizes digitadas implicitamente com uma new expressão (CS0820).
  • Verifique se todos os elementos em um inicializador de matriz digitado implicitamente têm um melhor tipo comum (CS0826).

Os exemplos a seguir mostram como declarar matrizes digitadas 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 };

Para garantir um melhor tipo comum, use qualquer uma destas técnicas:

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

Inicializador de matriz inválido

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

Esses erros indicam sintaxe inválida do inicializador de matriz. Para obter mais informações, consulte Matrizes.

Para criar inicializadores de matriz válidos:

  • Use inicializadores de matriz somente em declarações de variável ou campo (CS0623). Use uma new expressão em outros contextos.
  • Equilibre chavetas ({ e }) em torno de elementos ou submatrizes (CS0846).
  • Verifique se a expressão de inicialização corresponde ao número de matrizes em uma inicialização de matriz irregular.
  • Use inicializadores de coleção somente com tipos de coleção, não com matrizes ou outros tipos (CS1925).

Construtor de coleções inválido

  • CS9175: Uma árvore de expressão pode não conter uma expressão de coleção.
  • CS9177: O tipo de retorno do método do construtor 'CollectionBuilderAttribute' deve corresponder ao tipo de coleção usado em 'betterness'.
  • CS9178: Não existe um tipo de destino para o tipo natural 'tipo'.
  • CS9179: O tipo de expressão de coleção deve ter um construtor aplicável que possa ser chamado sem argumentos.
  • CS9180: O método construtor 'CollectionBuilderAttribute' deve ser um método estático.
  • CS9181: O tipo de parâmetro do método do construtor 'CollectionBuilderAttribute' deve corresponder ao parâmetro 'ReadOnlySpan<{0}>'
  • CS9182: 'CollectionBuilderAttribute' inválido. Nenhum método '{0}' correspondente foi encontrado no tipo de construtor '{1}'.
  • CS9183: O tipo de retorno do método 'CollectionBuilderAttribute' deve ser um tipo não-abstrato, não-interface utilizável como um 'tipo'
  • CS9185: Um tipo estático não pode ser usado como um argumento de tipo.
  • CS9186: O nome do CollectionBuilderAttribute método é inválido.
  • CS9187: Não foi possível encontrar um método 'Create' acessível com a assinatura esperada: um método estático com um único parâmetro do tipo 'ReadOnlySpan<{0}>' e do tipo de retorno '{1}'.
  • CS9188: 'scoped' não pode ser usado como um modificador em um parâmetro de tipo de expressão de coleção.
  • CS9190: O método 'CollectionBuilderAttribute' 'builderMethod' é inaplicável porque é genérico.
  • CS9192: Conversões de matriz embutida não podem ser usadas com expressões de coleção.
  • CS9193: O argumento 'argumento' não pode ser passado com a palavra-chave 'ref'.
  • CS9194: O argumento 'argumento' não pode ser passado com a palavra-chave 'out'
  • CS9195: O argumento 'argumento' não deve ser passado com a palavra-chave 'in'
  • CS9196: O recurso 'expressão de coleção' não está disponível em C# 'versão'. Utilize a versão linguística «requiredVersion» ou superior.
  • CS9197: O recurso 'matrizes embutidas' não está disponível em C# 'versão'. Utilize a versão linguística «requiredVersion» ou superior.
  • CS9198: O recurso 'ref e unsafe em métodos async e iteradores' não está disponível em C# 'version'. Utilize a versão de linguagem «requiredVersion» ou superior.
  • CS9199: O recurso 'expressão de coleção' não está disponível em C# 'versão'. Utilize a versão linguística «requiredVersion» ou superior.
  • CS9202: O recurso 'ref readonly parameters' não está disponível em C# 'version'. Utilize a versão linguística «requiredVersion» ou superior.
  • CS9208: operador 'nameof' não pode ser usado em um acesso de matriz embutida.
  • CS9209: Uma propriedade ref-return 'propriedade' não pode ser usada como um argumento de valor.
  • CS9211: A expressão deve ser do tipo 'tipo' porque está sendo atribuída por referência
  • CS9212: Não é possível usar a expressão de coleção como o valor em uma instrução fixa
  • CS9217: Um local 'ref' não pode ser preservado através do limite 'await' ou 'yield'.
  • CS9218: 'paramName' é um ref struct e não pode ser o tipo de parâmetro
  • CS9221: O tipo «tipo» não pode ser um ref struct ou um parâmetro de tipo que permita ref structs para o utilizar como parâmetro «parâmetro» em tipo genérico ou método «membro»
  • CS9223: Uma struct que contém campos 'ref' não pode ser usada em uma expressão de coleção.
  • CS9228: Não é permitida a declaração não variável de uma estrutura ref
  • CS9232: As declarações parciais de método têm diferenças de assinatura.
  • CS9233: O modificador 'arquivo' pode ser usado apenas em tipos definidos no nível superior em uma unidade de compilação

Para criar expressões de coleção com atributos do construtor de coleções corretamente, siga estes requisitos. Para obter mais informações, consulte Expressões de coleção.

  • Verifique se o tipo de destino tem um tipo de iteração que suporte foreach (CS9188).
  • Não use tipos genéricos como tipos de construtor de coleções (CS9185).
  • Verifique se o nome do método especificado em CollectionBuilderAttribute é válido (CS9186).
  • Aplique CollectionBuilderAttribute somente com métodos estáticos que correspondam à assinatura necessária: retorne o tipo de coleção e pegue um ReadOnlySpan<T> parâmetro onde T corresponda ao tipo de elemento (CS9180, CS9181, CS9182, CS9183, CS9187, CS9190).
  • Verifique se o tipo de retorno corresponde e não é abstrato ou uma interface (CS9177, CS9183).
  • Não use ref structs ou tipos com campos ref em expressões de coleção (CS9218, CS9221, CS9223, CS9228).
  • Evite usar expressões de coleção em árvores de expressão (CS9175).
  • Use a versão de idioma correta para expressões de coleção e recursos relacionados (CS9196, CS9197, CS9198, CS9199, CS9202).

Avisos de especificação de linguagem comum

  • CS3007: Método sobrecarregado que difere apenas por tipos de matriz sem nome não é compatível com CLS
  • CS3016: Matrizes como argumentos de atributo não é compatível com CLS

Para escrever código compatível com CLS com matrizes, siga estas diretrizes. Para obter mais informações, consulte Independência de idioma.

  • Não crie métodos sobrecarregados que diferem apenas em tipos de elementos de matriz (CS3007).
  • Não use matrizes como argumentos de atributo (CS3016).

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 com CLS não for necessária, remova o CLSCompliantAttribute atributo. Para obter mais informações sobre conformidade CLS, consulte Independência de idioma e componentes independentes de idioma.

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 idioma e componentes independentes de idioma.