Nota
O acesso a esta página requer autorização. Pode tentar iniciar sessão ou alterar os diretórios.
O acesso a esta página requer autorização. Pode tentar alterar os diretórios.
Este artigo aborda os seguintes erros e avisos do compilador:
- CS9125: O parâmetro de atributo 'SizeConst' deve ser especificado.
-
CS9164: Não é possível converter expressão em
Span<T>porque não é uma variável atribuível -
CS9165: Não é possível converter expressão em
ReadOnlySpan<T>porque ela pode não ser passada ou retornada por referência - CS9166: O índice está fora dos limites da matriz embutida
- CS9167: O comprimento da matriz embutida deve ser maior que 0.
- CS9168: Inline array struct não deve ter layout explícito.
- CS9169: Inline array struct deve declarar um e apenas um campo de instância que não deve ser um campo ref.
-
CS9172: Os elementos de um tipo de matriz embutida podem ser acessados somente com um único argumento implicitamente conversível em
int,System.IndexouSystem.Range. - CS9173: Um acesso de matriz embutida pode não ter um especificador de argumento nomeado
- CS9180: O campo de elemento de matriz embutida não pode ser declarado como necessário, somente leitura, volátil ou como um buffer de tamanho fixo.
- CS9181: O indexador de matriz embutida não será usado para expressão de acesso a elementos.
- CS9182: O método 'Slice' da matriz embutida não será usado para a expressão de acesso ao elemento.
- CS9183: O operador de conversão de matriz embutida não será usado para conversão a partir da expressão do tipo declarante.
-
CS9184: O recurso de linguagem 'Matrizes embutidas' não é suportado para tipos de matriz embutida com campo de elemento que é um campo '' ou tem tipo que não é válido como um argumento de
reftipo. -
CS9189:
foreachinstrução em uma matriz embutida do tipo não é suportada - CS9259: Atributo System.Runtime.CompilerServices.InlineArrayAttribute não pode ser aplicado a uma estrutura de registro.
Declaração de matriz embutida
Você declara matrizes embutidas como um struct tipo com um único campo e um atributo que especifica o comprimento da matriz. O compilador gera os seguintes erros para declarações de matriz in-line inválidas:
- CS9125: O parâmetro de atributo 'SizeConst' deve ser especificado.
- CS9167: O comprimento da matriz embutida deve ser maior que 0.
- CS9168: Inline array struct não deve ter layout explícito.
- CS9169: Inline array struct deve declarar um e apenas um campo de instância que não deve ser um campo ref.
- CS9180: O campo de elemento de matriz embutida não pode ser declarado como necessário, somente leitura, volátil ou como um buffer de tamanho fixo.
-
CS9184: O recurso de linguagem 'Matrizes embutidas' não é suportado para tipos de matriz embutida com campo de elemento que é um campo '' ou tem tipo que não é válido como um argumento de
reftipo. - CS9259: Atributo System.Runtime.CompilerServices.InlineArrayAttribute não pode ser aplicado a uma estrutura de registro.
Para corrigir essas matrizes, verifique se o seguinte é verdadeiro:
- O argumento para o System.Runtime.CompilerServices.InlineArrayAttribute é um número inteiro positivo.
- O anexo
structnão especifica nenhum layout explícito. - O anexo
structtem um único campo de instância, e esse campo de instância não é umrefcampo. - O campo de instância única não é um buffer de tamanho fixo.
- O campo de instância única não inclui os
requiredmodificadores ,volatileoureadonly. - Remova o
recordmodificador da declaração de matriz embutida.
Acesso a elementos
Você acessa elementos de uma matriz embutida da mesma forma que qualquer matriz. O compilador emite os seguintes erros de acesso incorreto ao elemento:
- CS9166: O índice está fora dos limites da matriz embutida
-
CS9172: Os elementos de um tipo de matriz embutida podem ser acessados somente com um único argumento implicitamente conversível em
int,System.IndexouSystem.Range. - CS9173: Um acesso de matriz embutida pode não ter um especificador de argumento nomeado
-
CS9189:
foreachinstrução em uma matriz embutida do tipo não é suportada
Além disso, o compilador emite o seguinte aviso quando você declara um indexador:
- CS9181: O indexador de matriz embutida não será usado para expressão de acesso a elementos.
O código gerado para um buffer embutido acessa a memória do buffer diretamente, ignorando quaisquer indexadores declarados. Matrizes embutidas não podem ser usadas com a foreach instrução.
O argumento para o indexador deve ser:
- Um destes três tipos:
int, aSystem.Indexou aSystem.Range. - Não pode ser um argumento nomeado. O compilador gera o acessador do elemento. O parâmetro não tem um nome, portanto, você não pode usar argumentos nomeados.
- Está incluído nos limites da matriz. Como todas as matrizes .NET, o acesso a elementos de matriz embutida é verificado por limites. O índice deve estar dentro dos limites da matriz embutida.
Conversões para Span
Você costuma usar System.Span<T> ou System.ReadOnlySpan<T> trabalhar com matrizes embutidas. O compilador gera os seguintes erros para conversões inválidas:
-
CS9164: Não é possível converter expressão em
Span<T>porque não é uma variável atribuível -
CS9165: Não é possível converter expressão em
ReadOnlySpan<T>porque ela pode não ser passada ou retornada por referência
O compilador gera código que acessa diretamente a memória para um buffer embutido. Portanto, alguns membros nunca são chamados. O compilador gera os seguintes avisos se você escrever um dos membros que nunca são chamados:
- CS9182: O método 'Slice' da matriz embutida não será usado para a expressão de acesso ao elemento.
- CS9183: O operador de conversão de matriz embutida não será usado para conversão a partir da expressão do tipo declarante.
Uma matriz embutida pode ser implicitamente convertida em uma Span<T> ou ReadOnlySpan<T> para passar uma matriz embutida para métodos. O compilador impõe restrições a essas conversões:
- A matriz embutida deve ser gravável para converter uma matriz embutida em .
Span<T>Se a matriz for somente leitura, não será possível convertê-la em gravávelSpan<T>. Você pode usarReadOnlySpan<T>em vez disso. - O contexto seguro da matriz embutida deve ser pelo menos tão amplo quanto o contexto seguro do
Span<T>ouReadOnlySpan<T>para que a conversão seja bem-sucedida. Você deve limitar o contexto da extensão ou expandir o escopo da matriz embutida.
Além disso, o compilador nunca gera chamadas para um Slice método em um buffer embutido. Operadores de conversão para converter um buffer embutido em um Span ou ReadOnlySpan não são chamados. O compilador gera código para criar um System.Span<T> ou System.ReadOnlySpan<T> diretamente a partir do buffer de memória.