Observação
O acesso a essa página exige autorização. Você pode tentar entrar ou alterar diretórios.
O acesso a essa página exige autorização. Você pode tentar alterar os diretórios.
O compilador C# gera erros e avisos ao declarar expressões de interpolação de cadeia de caracteres ou manipuladores de interpolação de cadeia de caracteres com sintaxe incorreta ou usá-los em contextos sem suporte. Esses diagnósticos ajudam a identificar problemas com interpolações de cadeia de caracteres ou manipuladores de interpolação de cadeia de caracteres personalizados.
- CS8361: uma expressão condicional não pode ser usada diretamente em uma interpolação de cadeia de caracteres porque o ':' encerra a interpolação. Parêntese a expressão condicional.
- CS8941: o método de manipulador de cadeia de caracteres interpolado está malformado. Ele não retorna 'void' ou 'bool'.
- CS8942: o método de manipulador de cadeia de caracteres interpolado tem um tipo de retorno inconsistente. Espera-se que retorne um tipo diferente.
- CS8946: O tipo não é um tipo de manipulador de cadeia de caracteres interpolada.
- CS8947: O parâmetro ocorre após o parâmetro de manipulador de cadeia de caracteres interpolada na lista de parâmetros, mas é usado como um argumento para conversões interpoladas do manipulador de cadeia de caracteres. Isso exigirá que o chamador reordene parâmetros com argumentos nomeados no site de chamada. Considere colocar o parâmetro de manipulador de cadeia de caracteres interpolado após todos os argumentos envolvidos.
- CS8953: uma construção de manipulador de cadeia de caracteres interpolada não pode usar dinâmico. Em vez disso, construa manualmente uma instância.
- CS8976: conversões de manipulador de cadeia de caracteres interpolada que fazem referência à instância que está sendo indexada não podem ser usadas em inicializadores de membro do indexador.
- CS9205: Cadeia de caracteres interpolada esperada.
- CS9325: argumentos de manipulador de cadeia de caracteres interpolados não são permitidos neste contexto.
Sintaxe da expressão de interpolação
- CS8361 - Uma expressão condicional não pode ser usada diretamente em uma interpolação de cadeia de caracteres porque ':' termina a interpolação. Parêntese a expressão condicional.
- CS9205 - Cadeia de caracteres interpolada esperada.
Para corrigir esses erros, aplique as seguintes técnicas:
- Envolva expressões condicionais (operador ternário
?:) entre parênteses quando usá-las dentro de um espaço de interpolação (CS8361). O caractere de dois-pontos tem um significado especial em cadeias de caracteres interpoladas, pois introduz uma cadeia de caracteres de formato, de modo que o compilador interpreta o:emcondition ? true : falsecomo um especificador de formato, em vez de parte da expressão condicional. Por exemplo, use$"{(x > 0 ? "positive" : "negative")}"ao invés de$"{x > 0 ? "positive" : "negative"}". - Forneça uma string literal interpolada em que uma é esperada (CS9205). Esse erro ocorre quando o compilador espera uma cadeia de caracteres interpolada (começando com
$"ou$@"), mas encontra um tipo de expressão diferente.
Implementação de tipo de manipulador de cadeia de caracteres interpolada
- CS8941 - O método de manipulador de cadeia de caracteres interpolado é malformado. Ele não retorna 'void' ou 'bool'.
- CS8942 - O método de manipulador de cadeia de caracteres interpolado tem um tipo de retorno inconsistente. Espera-se que retorne um tipo diferente.
- CS8946 - O tipo não é um tipo de manipulador de cadeia de caracteres interpolada.
Ao implementar um manipulador de cadeia de caracteres interpolado personalizado, aplique as seguintes técnicas:
- Certifique-se de que os métodos
AppendLiteraleAppendFormattedretornemvoidoubool(CS8941). O padrão de manipulador requer que esses métodos tenham um desses tipos de retorno para que o compilador possa gerar corretamente o código de interpolação. Os métodos que retornamboolhabilitam o curto-circuito quando o manipulador determina que o processamento adicional não é necessário. - Verifique se todos os métodos de acréscimo no tipo de manipulador usam o mesmo tipo de retorno (CS8942). Se um método retornar
void, todos os métodos de acréscimo deverão retornarvoid. Se um retornarbool, todos deverão retornarbool. A combinação de tipos de retorno impede que o compilador gere código de interpolação consistente. - Aplique o InterpolatedStringHandlerAttribute tipo de manipulador e verifique se ele tem um construtor válido (CS8946). Um tipo de manipulador de cadeia de caracteres interpolado deve ser marcado com esse atributo e seguir o padrão de manipulador a ser reconhecido pelo compilador.
Restrições de uso do manipulador de cadeia de caracteres interpolada
- CS8947 - O parâmetro ocorre após o parâmetro de manipulador de cadeia de caracteres interpolada na lista de parâmetros, mas é usado como um argumento para conversões de manipulador de cadeia de caracteres interpolada. Isso exigirá que o chamador reordene parâmetros com argumentos nomeados no site de chamada. Considere colocar o parâmetro de manipulador de cadeia de caracteres interpolado após todos os argumentos envolvidos.
- CS8953 - Uma construção de manipulador de cadeia de caracteres interpolada não pode usar dinâmico. Construa manualmente uma instância de '{0}'.
- CS8976 - Conversões de manipulador de cadeia de caracteres interpoladas que fazem referência à instância indexada não podem ser usadas em inicializadores de membro do indexador.
- CS9325 - Argumentos de manipulador de cadeia de caracteres interpolados não são permitidos neste contexto.
Ao usar manipuladores de cadeias de caracteres interpoladas, aplique as seguintes técnicas:
- Reordene os parâmetros do método para que todos os InterpolatedStringHandlerArgumentAttribute parâmetros usados pelo apareçam antes do parâmetro de manipulador de cadeia de caracteres interpolado (CS8947). Esse aviso indica que os chamadores precisariam usar argumentos nomeados para invocar corretamente o método, o que reduz a usabilidade. Coloque o parâmetro do manipulador após todos os argumentos dos quais ele depende.
- Não use valores tipados
dynamiccomo argumentos para conversões de manipulador de strings interpoladas (CS8953). O compilador não pode determinar os requisitos de construção do manipulador em tempo de compilação quando os valores dinâmicos estão envolvidos. Em vez disso, construa manualmente a instância do manipulador e chame seus métodos diretamente. - Não use cadeias de caracteres interpoladas que referenciam a instância que está sendo inicializada em inicializadores de membro do indexador (CS8976). Durante a inicialização do objeto, a instância não está totalmente construída, portanto, conversões de manipulador que tentam referenciar a instância através de
thisnão são permitidas. Use uma instrução separada após a inicialização para definir o valor do indexador. - Verifique o contexto em que você está usando argumentos de manipulador de cadeia de caracteres interpolados (CS9325). Alguns contextos não dão suporte a atributos de argumento do manipulador. Nesses casos, use uma cadeia de caracteres interpolada regular ou construa manualmente o manipulador.