Compartilhar via


Resolver erros e avisos para declarações literais de cadeia de caracteres

O compilador C# gera erros e avisos quando você declara literais de cadeia de caracteres com sintaxe incorreta ou os usa em contextos sem suporte. Esses diagnósticos ajudam a identificar problemas com literais de string básicos, literais de caracteres, literais de string bruta e literais de string UTF-8.

  • CS1009: sequência de escape não reconhecida.
  • CS1010: Nova linha em constante.
  • CS1011: Literal de Caractere Vazio.
  • CS1012: Caractere literal contém muitos caracteres.
  • CS1039: literal de cadeia de caracteres não finalizada.
  • CS8996: Literais de string brutos não são permitidos em diretivas de pré-processador.
  • CS8997: literal bruto de cadeia de caracteres não terminada.
  • CS8998: Não há aspas iniciais suficientes para esse conteúdo de cadeia de caracteres bruto.
  • CS8999: a linha não começa com o mesmo espaço em branco que a linha de fechamento do literal de cadeia de caracteres bruta.
  • CS9000: Delimitador literal de cadeia de caracteres bruta deve estar em sua própria linha.
  • CS9001: Literais de cadeia de caracteres brutos de várias linhas só são permitidos em cadeias de caracteres interpoladas verbatim.
  • CS9002: Os literais de strings brutas de múltiplas linhas devem conter pelo menos uma linha de conteúdo.
  • CS9003: linha contém um espaço em branco diferente do esperado.
  • CS9004: Aspas não suficientes para literal de cadeia de caracteres bruta.
  • CS9005: Não há chaves de fechamento suficientes para literal de cadeia de caracteres bruta interpolada.
  • CS9006: Muitas chaves de abertura para literal de cadeia de caracteres bruta interpolada.
  • CS9007: Muitos colchetes de fechamento para literal de cadeia de caracteres bruta interpolada.
  • CS9008: A sequência de caracteres '@' não é permitida.
  • CS9009: a cadeia de caracteres deve começar com o caractere de aspas.
  • CS9026: A cadeia de caracteres de entrada não pode ser convertida na representação de bytes UTF-8 equivalente.
  • CS9047: O operador não pode ser aplicado a operandos que não são representações de bytes UTF-8.
  • CS9274: Não é possível emitir esse literal de cadeia de caracteres na seção de dados porque ele tem colisão XXHash128 com outro literal de cadeia de caracteres.
  • CS9315: o comprimento combinado das cadeias de caracteres de usuário usadas pelo programa excede o limite permitido. Adicionar um literal de cadeia de caracteres requer a reinicialização do aplicativo.

Literais de cadeia de caracteres formados incorretamente

  • CS1009 - Sequência de escape não reconhecida.
  • CS1010 - Nova linha em constante.
  • CS1011 - Literal de caractere vazio.
  • CS1012 - Muitos caracteres na constante de caractere.
  • CS1039 - Literal de cadeia de caracteres não encerrada.

Para corrigir esses erros, aplique as seguintes técnicas:

  • Use uma das sequências de escape padrão definidas na especificação da linguagem C#, como \n (nova linha), \t (tabulação), \\ (barra invertida) ou \" (aspa dupla) (CS1009). O compilador não reconhece sequências de escape que não fazem parte da especificação de idioma, portanto, o uso de sequências de escape indefinidas causa esse erro porque o compilador não pode determinar qual caractere você pretendia representar.
  • Adicione o caractere de aspas de fechamento para concluir o literal de string (CS1039). Literais de cadeia de caracteres devem ter um delimitador de abertura e fechamento, portanto, uma cadeia de caracteres não terminada faz com que o compilador trate o código-fonte subsequente como parte do conteúdo da cadeia de caracteres, o que leva a erros de análise.
  • Adicione exatamente um caractere entre as aspas simples em seu literal de caractere (CS1011, CS1012). Literais de caractere representam um único valor de caractere e devem conter exatamente um caractere ou uma sequência de escape válida. Portanto, literais de caractere vazios ou aqueles que contêm vários caracteres violam as regras da linguagem tipo char.
  • Dividir literais de cadeia de caracteres que abrangem várias linhas de origem terminando cada linha com uma aspa de fechamento e iniciando a próxima linha com uma aspa de abertura, usando o + operador para concatenar elas (CS1010). Literais de cadeia de caracteres regulares não podem conter caracteres de nova linha reais porque a aspa de fechamento deve aparecer na mesma linha da aspa de abertura, mas você pode alcançar cadeias de caracteres de várias linhas por meio de concatenação ou usando cadeias de caracteres verbatim ou literais de cadeia de caracteres brutos, que permitem novas linhas inseridas como parte do conteúdo da cadeia de caracteres.

Para obter mais informações, consulte cadeias de caracteres.

Literais de cadeia de caracteres brutos formados incorretamente

  • CS8996 - Literais de cadeia de caracteres brutos não são permitidos em diretivas de pré-processador.
  • CS8997 - Literal de string bruta não terminada.
  • CS8998 - Não há aspas iniciais suficientes para esse conteúdo de cadeia de caracteres bruto.
  • CS8999 - A linha não começa com o mesmo espaço em branco que a linha de fechamento do literal de cadeia de caracteres bruta.
  • CS9000 - Delimitador literal de cadeia de caracteres bruta deve estar em sua própria linha.
  • CS9001 - Literais de cadeia de caracteres brutos de várias linhas só são permitidos em cadeias de caracteres interpoladas literais.
  • CS9002 - Literais de cadeia de caracteres bruta em várias linhas devem incluir ao menos uma linha com conteúdo.
  • CS9003 - A linha contém um espaço em branco diferente do esperado.
  • CS9004 - Aspas não suficientes para cadeia de caracteres literal bruta.
  • CS9005 - Não há chaves de fechamento suficientes para a cadeia de caracteres bruta interpolada.
  • CS9006 - Excesso de chaves de abertura para cadeia de caracteres bruta interpolada.
  • CS9007 - Muitas chaves de fechamento para literal de cadeia de caracteres bruta interpolada.
  • CS9008 - A sequência de caracteres '@' não é permitida.
  • CS9009 - A cadeia de caracteres deve começar com o caractere de aspas.

Para corrigir esses erros, aplique as seguintes técnicas:

  • Use literais de cadeia de caracteres regulares ou literais de cadeia de caracteres verbatim em vez de literais de cadeia de caracteres brutos em diretivas de pré-processador, como #if, #defineou #pragma (CS8996). As diretivas de pré-processador são avaliadas durante a fase de pré-processamento antes da análise léxica, portanto, o compilador não pode reconhecer a sintaxe literal de cadeia de caracteres bruta nesses contextos porque cadeias de caracteres brutas são identificadas durante a fase de análise lexical posterior.
  • Adicione um delimitador de fechamento que corresponda ao delimitador de abertura para concluir seu literal de cadeia de caracteres bruto (CS8997, CS9004). A sintaxe literal de cadeia de caracteres bruta requer que os delimitadores de abertura e fechamento contenham o mesmo número de caracteres de aspas duplas consecutivas (pelo menos três), portanto, um delimitador de fechamento ausente ou incompatível impede que o compilador determine onde o conteúdo da cadeia de caracteres termina.
  • Coloque os delimitadores de abertura e fechamento de literais de cadeia de caracteres brutos de várias linhas em suas próprias linhas, sem nenhum outro conteúdo nessas linhas (CS9000). As regras de formato de string bruta em várias linhas exigem que os delimitadores ocupem linhas dedicadas para estabelecer limites claros para o conteúdo da string e permitir o comportamento de corte de espaços em branco, que remove a indentação comum de todas as linhas de conteúdo.
  • Adicione pelo menos uma linha de conteúdo entre os delimitadores de abertura e fechamento do literal de cadeia de caracteres bruta de várias linhas (CS9002). A especificação de linguagem requer cadeias de caracteres brutas de várias linhas para conter conteúdo real porque cadeias de caracteres brutas de várias linhas vazias não servem para nenhum propósito e provavelmente indicam código incompleto, enquanto cadeias de caracteres brutas de linha única (com delimitadores na mesma linha) podem estar vazias e são a sintaxe apropriada para valores de cadeia de caracteres vazios.
  • Ajuste o recuo das linhas de conteúdo da cadeia de caracteres brutas para corresponder ou exceder o recuo da linha delimitador final (CS8999, CS9003). As regras de tratamento de espaço em branco para literais de cadeia de caracteres brutos usam o espaço em branco principal do delimitador de fechamento como a linha de base para cortar o recuo comum de todas as linhas de conteúdo, portanto, linhas de conteúdo com menos recuo do que o delimitador de fechamento violam esse algoritmo de corte e indicam formatação incorreta.
  • Aumente o número de aspas duplas no delimitador da string bruta para exceder qualquer sequência contínua de aspas no conteúdo (CS8998). O delimitador deve conter aspas mais consecutivas do que qualquer sequência dentro do conteúdo da cadeia de caracteres para que o compilador possa distinguir sem ambiguidade entre os caracteres de aspas que fazem parte do conteúdo e a sequência delimitador que marca o final da cadeia de caracteres.
  • Para literais de cadeia de caracteres brutos interpolados, verifique se o número de sinais de dólar ($) no início corresponde ao número de chaves de abertura ou fechamento consecutivas de que você precisa como conteúdo literal (CS9005, CS9006, CS9007). A sintaxe de cadeia de caracteres bruta interpolada usa a contagem de sinais de dólar para determinar o comprimento da sequência de escape das chaves. Portanto, $$""" requer o uso de {{ para os buracos de interpolação e aceita caracteres únicos { como conteúdo. Enquanto isso, sequências de chaves incompatíveis indicam uma sintaxe de interpolação incorreta ou um conteúdo que precisa de uma contagem de sinais de dólar diferente.
  • Remova o prefixo @ do string literal bruto e use apenas o delimitador de aspas (CS9008, CS9009). Literais de cadeia de caracteres brutos são uma sintaxe distinta introduzida no C# 11 que não usa o @ prefixo de cadeia de caracteres verbatim e a especificação de linguagem não permite combinar a @ sintaxe verbatim com delimitadores de cadeia de caracteres brutos porque cadeias de caracteres brutas já dão suporte a conteúdo de várias linhas e não exigem sequências de escape.

Observação

O CS9001 não é mais produzido nas versões atuais do C#. Os literais de cadeia de caracteres brutos de várias linhas agora dão suporte à interpolação sem a necessidade de formato verbatim.

Para obter mais informações, consulte literais de cadeia de caracteres brutos.

Cadeia de caracteres UTF-8 literais

  • CS9026 - A cadeia de caracteres de entrada não pode ser convertida na representação de bytes UTF-8 equivalente.
  • CS9047 - O operador não pode ser aplicado a operandos que não são representações de bytes UTF-8.

Para corrigir esses erros, aplique as seguintes técnicas:

  • Remova caracteres ou sequências de escape que não podem ser codificados em UTF-8 do literal da cadeia de caracteres u8 (CS9026). A especificação de codificação UTF-8 dá suporte ao conjunto de caracteres Unicode completo, mas requer valores escalares Unicode válidos, portanto, os pontos de código alternativos (valores no intervalo U+D800 a U+DFFF) não podem aparecer diretamente em cadeias de caracteres UTF-8 porque são reservados para codificação de par alternativo UTF-16 em vez de representar caracteres autônomos e tentar codificar como UTF-8 produziria uma sequência de bytes inválida.
  • Verifique se ambos os operandos do operador de adição são literais de cadeia de caracteres UTF-8 (marcados com o u8 sufixo) ao concatenar cadeias de caracteres UTF-8 (CS9047). O compilador fornece suporte especial para concatenar literais de string UTF-8 em tempo de compilação, o que gera valores que representam as sequências de bytes UTF-8 concatenadas ReadOnlySpan<byte>, mas a combinação de strings UTF-8 com valores regulares string ou outros tipos não é suportada porque o sistema de tipos não pode determinar se deve gerar uma sequência de bytes ou uma cadeia de caracteres, e as representações subjacentes (bytes UTF-8 versus caracteres UTF-16) são fundamentalmente incompatíveis.

Para obter mais informações, consulte literais de cadeia de caracteres UTF-8.

Cadeias de caracteres literais em seções de dados

  • CS9274: Não é possível emitir esse literal de cadeia de caracteres na seção de dados porque ele tem colisão XXHash128 com outro literal de cadeia de caracteres.
  • CS9315: o comprimento combinado das cadeias de caracteres de usuário usadas pelo programa excede o limite permitido. Adicionar um literal de cadeia de caracteres requer a reinicialização do aplicativo.

Para corrigir esses problemas, experimente as seguintes técnicas:

  • Desabilite o recurso de literais de string da seção experimental de dados para o aplicativo quando encontrar uma colisão de hash (CS9274). Esse erro indica que dois literais de cadeia de caracteres diferentes produziram o mesmo valor XXHash128, o que impede que a otimização funcione corretamente, portanto, você deve remover o sinalizador de recurso que habilita esse comportamento experimental.
  • Reinicie seu aplicativo depois de modificar literais de string durante uma sessão de depuração quando o recurso de seção de dados estiver habilitado (CS9315). A infraestrutura de recarregamento dinâmico não pode atualizar literais de cadeia de caracteres armazenados na seção de dados porque eles estão inseridos em um formato especial que não pode ser modificado em tempo de execução, por isso, continuar a execução com os valores antigos da cadeia de caracteres resultaria em um comportamento incorreto.