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
- CS1063: O melhor método Add sobrecarregado para o elemento inicializador de coleção está obsoleto.
- 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.
- CS1950: O melhor método Add sobrecarregado do inicializador de coleção tem alguns argumentos inválidos.
- 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âmetrosref
ouout
. - 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:
- CS1062: O melhor método Add sobrecarregado para o elemento inicializador de coleção está obsoleto.
- CS1064: O melhor método Add sobrecarregado para o elemento inicializador de coleção está obsoleto.
- 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.
- CS1063: O melhor método Add sobrecarregado para o elemento inicializador de coleção está obsoleto.
- 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. - CS1950: O melhor método Add sobrecarregado do inicializador de coleção tem alguns argumentos inválidos.
- 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âmetrosref
ouout
. - 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:
- CS1062: O melhor método Add sobrecarregado para o elemento inicializador de coleção está obsoleto.
- CS1064: O melhor método Add sobrecarregado para o elemento inicializador de coleção está obsoleto.
- 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. - A classe deve implementar IEnumerable e ter um método público
Add
. - 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 modificadorref
ouout
. - 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:
- 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.
- 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:
- O tipo dos elementos da matriz. Por exemplo,
int
,string
ouSomeClassType
. - Os colchetes de matriz, opcionalmente incluindo vírgulas para representar várias dimensões.
- 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 queT
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.