Erros e avisos associados a geradores de origem e interceptores

Os seguintes erros ocorrem quando o compilador carrega geradores de origem ou interceptores durante a compilação:

  • CS9137: o recurso 'interceptores' não está habilitado nesse namespace. Adicione <Features>InterceptorsPreview</Features> ao seu projeto.
  • CS9138: o método 'method' não pode ser usado como um interceptor porque seu tipo de contenção tem parâmetros de tipo.
  • CS9139: Não é possível interceptar: a compilação não contém um arquivo com caminho.
  • CS9140: Não é possível interceptar: a compilação não contém um arquivo com o caminho 'path'. Você queria usar o caminho "candidatePath"?
  • CS9141: a linha e o número de caractere fornecidos não se referem a um nome de método interceptável, mas sim ao token 'token'.
  • CS9142: O arquivo fornecido tem n linhas, que é menor do que o número de linhas fornecido m.
  • CS9143: a linha fornecida tem c caracteres longos, o que é menor que o número nde caracteres fornecido.
  • CS9144: Não é possível interceptar o método M com o interceptor V porque as assinaturas não correspondem.
  • CS9145: Não é possível interceptar: o caminho não é mapeado. Caminho mapeado esperado.
  • CS9146: Um método interceptor deve ser um método membro regular.
  • CS9147: a linha e o número de caractere fornecidos não se referem ao início do token 'token'. Você quis usar a linha 'n' e o caractere 'c'?
  • CS9148: this
  • CS9149: O interceptor não deve ter um this parâmetro porque o método não tem um this parâmetro.
  • CS9150: O interceptor não pode ter um null caminho de arquivo.
  • CS9151: O nome M do método possível não pode ser interceptado porque ele não está sendo invocado.
  • CS9152: Não é possível interceptar uma chamada no arquivo com o caminho 'path' porque vários arquivos na compilação têm esse caminho.
  • CS9153: a chamada indicada é interceptada várias vezes.
  • CS9155: Não é possível interceptar a chamada M porque ela não está acessível dentro V.
  • CS9156: Não é possível interceptar a chamada para M com V devido a uma diferença em modificadores 'com escopo' ou atributos [UnscopedRef].
  • CS9157: Os números de linha e caractere fornecidos para InterceptsLocationAttribute devem ser positivos.
  • CS9160: Um operador nameof não pode ser interceptado.
  • CS9161: Um interceptor não pode ser marcado com UnmanagedCallersOnlyAttribute.
  • CS9177: O método 'method' deve ser não genérico ou ter aridade 'arity' para corresponder a 'target'.
  • CS9178: o método 'method' deve ser não genérico para corresponder a 'target'.
  • CS9206: Um interceptor não pode ser declarado no namespace global.
  • CS9207: Não é possível interceptar o 'método' porque ele não é uma invocação de um método de membro comum.
  • CS9231: O argumento de dados para InterceptsLocationAttribute não está no formato correto.
  • CS9232: A versão 'version' do formato dos interceptores não é suportada. A versão mais recente com suporte é '1'.
  • CS9233: Não é possível interceptar uma chamada no arquivo 'file' porque ela é duplicada em outro lugar na compilação.
  • CS9234: Não é possível interceptar uma chamada no arquivo 'file' porque um arquivo correspondente não foi encontrado na compilação.
  • CS9235: O argumento de dados para InterceptsLocationAttribute refere-se a uma posição inválida no arquivo 'file'.

Os seguintes avisos ocorrem quando o compilador carrega geradores de origem ou interceptores durante a compilação:

  • CS8032: Uma instância do analisador 'analyzer' não pode ser criada a partir de 'assembly' : 'reason'.
  • CS8033: O assembly 'assembly' não contém analisadores.
  • CS8034: Não é possível carregar o assembly do Analisador 'assembly': 'motivo'
  • CS8040: Ignorando alguns tipos no assembly do analisador 'assembly' devido a uma ReflectionTypeLoadException: 'exception'.
  • CS8700: vários arquivos de configuração do analisador não podem estar no mesmo diretório ('diretório').
  • CS8784: O gerador 'generator' falhou ao inicializar. Ele não contribuirá para a saída, e erros de compilação poderão ocorrer como resultado. A exceção era do tipo 'exception' com a mensagem 'message'.
  • CS8785: O gerador 'generator' não conseguiu gerar o código-fonte. Ele não contribuirá para a saída, e erros de compilação poderão ocorrer como resultado. A exceção era do tipo 'exception' com a mensagem 'message'.
  • CS8850: O assembly 'assembly' que contém o tipo 'type' faz referência ao .NET Framework, que não é compatível.
  • CS9057: O assembly do analisador 'assembly' não pode ser usado porque faz referência à versão 'version' do compilador, que é mais recente do que a versão atualmente em execução 'currentVersion'.
  • CS9067: A referência do analisador 'reference' foi especificada várias vezes
  • CS9154: interceptando uma chamada para M com o interceptador V, mas as assinaturas não correspondem.
  • CS9158: A anulabilidade de tipos de referência no tipo de retorno não está de acordo com o método que pode ser interceptado.
  • CS9159: A anulação de tipos de referência no tipo de parâmetro não está de acordo com o método interceptável.
  • CS9270: 'InterceptsLocationAttribute(string, int, int)' não tem suporte. Mova para a geração baseada em 'InterceptableLocation' desses atributos. (https://github.com/dotnet/roslyn/issues/72133)

Estes erros e avisos seguem estes temas:

Falhas no gerador de origem

  • CS8784: O gerador 'generator' falhou ao inicializar. Ele não contribuirá para a saída, e erros de compilação poderão ocorrer como resultado. A exceção era do tipo 'exception' com a mensagem 'message'.
  • CS8785: O gerador 'generator' falhou ao gerar o código-fonte. Ele não contribuirá para a saída, e erros de compilação poderão ocorrer como resultado. A exceção era do tipo 'exception' com a mensagem 'message'.

Esses avisos indicam que um gerador de origem gerou uma exceção sem tratamento durante a compilação. Os geradores de código-fonte são executados como parte do pipeline de compilação, e uma falha impede que o gerador adicione sua saída à compilação. Para obter mais informações sobre como implementar geradores de origem, consulte Geradores de Origem.

Para corrigir esses avisos, siga estas diretrizes:

  • Examine os detalhes completos da exceção na saída do build para identificar a causa raiz (CS8784, CS8785). A mensagem de aviso inclui o tipo de exceção, a mensagem e o rastreamento de pilha, que podem ajudar você ou o autor do gerador a diagnosticar a falha.
  • Verifique se todas as dependências necessárias para o gerador de origem estão disponíveis no projeto (CS8784). As falhas de inicialização geralmente ocorrem quando o gerador não consegue localizar um assembly ou recurso necessário durante a inicialização. Verifique se o pacote NuGet do gerador está instalado corretamente e todas as dependências transitivas são resolvidas.
  • Comunique a falha ao mantenedor do gerador de código-fonte se a exceção tiver origem no código de um gerador de terceiros (CS8784, CS8785). Inclua os detalhes completos da exceção na saída da compilação no seu relatório de erro.
  • Se você criou o gerador de código-fonte, adicione tratamento de exceções nos métodos Initialize ou Execute para capturar e relatar erros de forma adequada (CS8784, CS8785).

Compatibilidade do analisador e do gerador de origem

  • CS8032: uma instância do analisador 'analyzer' não pode ser criada a partir de 'assembly' : 'reason'.
  • CS8033: O assembly 'assembly' não contém analisadores.
  • CS8034: Não é possível carregar a assemblagem do Analisador 'assembly': 'motivo'
  • CS8040: Ignorando alguns tipos no assembly do analisador 'assembly' devido a uma ReflectionTypeLoadException : 'exception'.
  • CS8700: vários arquivos de configuração do analisador não podem estar no mesmo diretório ('diretório').
  • CS8850: O assembly 'assembly' que contém o tipo 'type' faz referência ao .NET Framework, que não é compatível.
  • CS9057: O conjunto do analisador 'assembly' não pode ser usado porque faz referência à versão 'version' do compilador, que é mais recente do que a versão 'currentVersion' que está em execução no momento.
  • CS9067: Referência 'referência' do analisador especificada várias vezes

Esses avisos e erros indicam problemas com o carregamento, a instanciação ou a configuração de assemblies do analisador e do gerador de origem. Como os geradores de código-fonte são carregados como assemblies de analisadores, esses diagnósticos se aplicam tanto aos analisadores quanto aos geradores de código-fonte.

Para corrigir esses problemas, siga estas diretrizes:

  • Atualize o SDK .NET ou a versão do compilador para corresponder aos requisitos do analisador ou use uma versão mais antiga do pacote do analisador compatível com o compilador atual (CS9057). Esse erro ocorre quando um assembly do analisador tem como destino uma versão mais recente da API roslyn do que o compilador em execução fornece.
  • Remova referências duplicadas do analisador de seu projeto (CS9067). Verifique no arquivo de projeto se há elementos <Analyzer> ou <PackageReference> repetidos que incluem o mesmo assembly do analisador por caminhos diferentes. Dependências transitivas de pacotes também podem causar duplicatas.
  • Verifique se o assembly do analisador é um assembly de .NET válido e não está corrompido (CS8034). Se o assembly não puder ser carregado, verifique se o arquivo existe no caminho referenciado e foi criado para uma estrutura de destino compatível. Recompile ou reinstale o pacote NuGet para obter uma nova cópia.
  • Verifique se o tipo de analisador tem um construtor público sem parâmetros (CS8032). O compilador instancia os analisadores chamando seu construtor padrão. Se o construtor gerar uma exceção ou exigir parâmetros, o analisador não poderá ser criado.
  • Verifique se o assembly referenciado realmente exporta tipos de analisador ou de gerador de código-fonte (CS8033). Um assembly referenciado como analisador deve conter tipos que implementam DiagnosticAnalyzer ou ISourceGenerator/IIncrementalGenerator. Se o assembly for uma dependência de runtime em vez de um analisador, faça referência a ele como uma referência normal de projeto ou pacote.
  • Resolva problemas de carregamento de tipos no assembly do analisador, garantindo que todas as suas dependências estejam disponíveis (CS8040). Um ReflectionTypeLoadException normalmente significa que o assembly faz referência a tipos de outros assemblies que não podem ser encontrados. Verifique se todas as dependências necessárias estão incluídas no pacote NuGet do analisador.
  • Verifique se os arquivos de configuração do analisador (.editorconfig ou .globalconfig) são exclusivos por diretório (CS8700). O compilador não permite vários arquivos de configuração do analisador no mesmo diretório porque as regras de precedência seriam ambíguas. Mescle os arquivos ou remova o arquivo duplicado.
  • Atualize o analisador ou o gerador de código-fonte para ter como destino o .NET Standard ou o .NET moderno em vez do .NET Framework (CS8850). Não há suporte para assemblies que fazem referência ao .NET Framework na cadeia de ferramentas moderna do compilador de .NET. Se você mantém o analisador, redirecione-o para netstandard2.0. Se for um pacote de terceiros, atualize para uma versão que dê suporte a .NET modernas.

Interceptores são experimentais

  • CS9137: o recurso 'interceptores' não está habilitado nesse namespace. Adicione <Features>InterceptorsPreview</Features> ao seu projeto.

Para usar interceptadores, adicione o <Features>InterceptorsPreview</Features> elemento ao arquivo de projeto em uma <PropertyGroup> seção (CS9137). Interceptadores são um recurso experimental e não são habilitados por padrão. Esse consentimento explícito é necessário porque o recurso de interceptores está sujeito a alterações incompatíveis ou pode ser removido em versões futuras. O compilador precisa de confirmação de que você entende os riscos antes de permitir seu uso. Para obter mais informações sobre interceptadores e suas funcionalidades, consulte Interceptores na documentação de recursos do C# 12.

Incompatibilidade de assinatura

Os erros e avisos a seguir indicam uma incompatibilidade entre o método interceptor e o método interceptável.

  • CS9144: Não é possível interceptar o método M com o interceptor V porque as assinaturas não correspondem.
  • CS9148: this
  • CS9149: O interceptor não deve ter um this parâmetro porque o método não tem um this parâmetro.
  • CS9155: Não é possível interceptar a chamada M porque ela não está acessível dentro V.
  • CS9156: Não é possível interceptar a chamada para M com V devido a uma diferença em modificadores 'com escopo' ou atributos [UnscopedRef].
  • CS9177: O método 'method' deve ser não genérico ou ter aridade 'arity' para corresponder a 'target'.
  • CS9178: o método 'method' deve ser não genérico para corresponder a 'target'.

Além disso, os avisos a seguir indicam uma incompatibilidade nas assinaturas do interceptor e do método interceptável:

  • CS9154: Interceptando uma chamada para M com o interceptador V, mas as assinaturas não correspondem.
  • CS9158: a nulidade de tipos de referência no tipo de retorno não corresponde ao método interceptável.
  • CS9159: A nulabilidade dos tipos de referência no tipo de parâmetro não corresponde ao método para interceptação.
  • CS9270: 'InterceptsLocationAttribute(string, int, int)' não tem suporte. Mova para a geração baseada em 'InterceptableLocation' desses atributos. (https://github.com/dotnet/roslyn/issues/72133)

Para corrigir esses problemas, verifique se o método interceptor corresponde aos requisitos de assinatura e acesso do método interceptável:

  • Verifique se a assinatura do método interceptor corresponde exatamente ao método interceptável (CS9144, CS9154). Os tipos de parâmetro, modificadores, ordem e tipo de retorno devem ser idênticos. Examine ambas as declarações de método e alinhe suas assinaturas.
  • Adicione um this parâmetro ao interceptador quando o método interceptável for um método de instância (CS9148) ou remova o this parâmetro quando o método interceptável for estático (CS9149). Os interceptadores de instância exigem um this parâmetro do tipo declarador, enquanto os interceptadores estáticos não devem ter um.
  • Declare seu interceptor em um local onde o método interceptável esteja acessível (CS9155). Se o método interceptável for internal, o interceptor deverá estar no mesmo assembly. Se for private, o interceptador deverá estar no mesmo tipo ou um tipo aninhado.
  • Corresponda os modificadores scoped e atributos [UnscopedRef] nos parâmetros ref correspondentes (CS9156). Cada ref parâmetro no interceptor deve ter as mesmas anotações de ciclo de vida que o parâmetro correspondente no método interceptável para garantir a segurança da memória.
  • Verifique se ambos os métodos têm aridade genérica correspondente (CS9177, CS9178). Se o método interceptável não for genérico, o interceptador também deverá ser não genérico. Se o método interceptável tiver parâmetros de tipo, o interceptor deverá ter o mesmo número de parâmetros de tipo com restrições compatíveis.
  • Alinhe as anotações de nulabilidade no tipo de retorno (CS9158) e nos tipos de parâmetro (CS9159). Habilite tipos de referência anuláveis em seu projeto e verifique se as anotações de nulidade do interceptador correspondem ao método interceptável exatamente para manter a segurança do tipo.
  • Use a geração baseada na atualização InterceptableLocation para InterceptsLocationAttribute, em vez do construtor preterido (string, int, int) (CS9270). O formato mais recente fornece melhor suporte de ferramentas e validação em tempo de compilação. Consulte o problema do GitHub para obter diretrizes de migração.

Mapeamento incorreto

Interceptores exigem um mapeamento de origem que mapeia o método interceptável e o método interceptor. Os seguintes erros indicam um problema com o mapeamento:

  • CS9139: Não é possível interceptar: a compilação não contém um arquivo com caminho.
  • CS9140: Não é possível interceptar: a compilação não contém um arquivo com o caminho 'path'. Você queria usar o caminho "candidatePath"?
  • CS9141: a linha e o número de caractere fornecidos não se referem a um nome de método interceptável, mas sim ao token 'token'.
  • CS9142: o arquivo fornecido tem n linhas, que é menor que o número mde linha fornecido.
  • CS9143: a linha fornecida tem c caracteres longos, o que é menor que o número nde caracteres fornecido.
  • CS9145: Não é possível interceptar: o caminho não é mapeado. Caminho mapeado esperado.
  • CS9147: a linha e o número de caractere fornecidos não se referem ao início do token 'token'. Você quis usar a linha 'n' e o caractere 'c'?
  • CS9150: O interceptor não pode ter um null caminho de arquivo.
  • CS9157: Os números de linha e caractere fornecidos para InterceptsLocationAttribute devem ser positivos.

Para corrigir erros de mapeamento, verifique se você InterceptsLocationAttribute contém caminhos de arquivo válidos e informações de posição precisas:

  • Verifique se o caminho do arquivo corresponde a um arquivo na compilação exatamente (CS9139, CS9140). Use o caminho exato conforme aparece em seu projeto, incluindo a grafia e os separadores de diretório corretos. Se o compilador sugerir um caminho alternativo, atualize seu atributo para usar esse caminho.
  • Use caminhos de arquivo mapeados ao trabalhar com geradores de origem que transformam caminhos de arquivo (CS9145). Os geradores de origem geralmente remapeam caminhos para arquivos gerados e você deve usar o caminho mapeado que o compilador reconhece, não o caminho de origem original.
  • Verifique se o caminho do arquivo não é null no seu InterceptsLocationAttribute (CS9150). Cada interceptação deve especificar um caminho de arquivo válido e não nulo que identifique o arquivo de origem que contém a chamada a ser interceptada.
  • Forneça números de linha e caracteres positivos baseados em 1 (CS9157). Os números de linha e as posições de caractere devem começar em 1, não 0. Verifique se o gerador de origem usa indexação baseada em 1 ao calcular posições.
  • Aponte para o início exato do token de nome do método (CS9141, CS9147). Os números de linha e caractere devem identificar o primeiro caractere do nome do método na invocação, não o espaço em branco, os operadores ou outros tokens. Se o compilador sugerir coordenadas alternativas, use-as para direcionar o início correto do token.
  • Fique dentro dos limites do arquivo (CS9142, CS9143). Verifique se o número de linha não excede a contagem total de linhas e se o número de caractere não excede o comprimento da linha. Recalcular posições se o arquivo de origem tiver sido alterado desde que o atributo foi gerado.

Declaração de interceptador incorreta

Os erros a seguir indicam problemas com declarações de interceptor, incluindo problemas com o InterceptsLocationAttribute formato ou violações de regras do interceptor:

  • CS9138: O método 'method' não pode ser usado como um interceptador porque o tipo que o contém possui parâmetros de tipo.
  • CS9146: Um método interceptor deve ser um método membro comum.
  • CS9151: O nome M do método possível não pode ser interceptado porque ele não está sendo invocado.
  • CS9152: Não é possível interceptar uma chamada no arquivo com o caminho 'path' porque vários arquivos na compilação têm esse caminho.
  • CS9153: a chamada indicada é interceptada várias vezes.
  • CS9160: Um operador nameof não pode ser interceptado.
  • CS9161: Um interceptor não pode ser marcado com UnmanagedCallersOnlyAttribute.
  • CS9206: Um interceptor não pode ser declarado no namespace global.
  • CS9207: Não é possível interceptar o 'método' porque ele não é uma invocação de um método de membro comum.
  • CS9231: O argumento de dados para InterceptsLocationAttribute não está no formato correto.
  • CS9232: A versão 'version' do formato de interceptores não é suportada. A versão mais recente suportada é '1'.
  • CS9233: Não é possível interceptar uma chamada no arquivo 'file' porque ela é duplicada em outro lugar na compilação.
  • CS9234: Não é possível interceptar uma chamada no arquivo 'file' porque um arquivo correspondente não foi encontrado na compilação.
  • CS9235: O argumento de dados para InterceptsLocationAttribute refere-se a uma posição inválida no arquivo 'file'.

Para corrigir erros de declaração de interceptador, siga estas regras para declarações de interceptador válidas e uso de InterceptsLocationAttribute.

  • Formate o argumento de InterceptsLocationAttribute dados corretamente (CS9231). O atributo requer dados estruturados especificamente que codificam informações de caminho e posição do arquivo. Verifique se o gerador de origem produz dados no formato esperado que corresponde à especificação atual dos interceptores.
  • Use a versão '1' em seu InterceptsLocationAttribute (CS9232), porque ela é a versão mais recente com suporte. Atualize o gerador de origem para que ele produza atributos de formato da versão 1, em vez de números de versão sem suporte.
  • Verifique os caminhos de arquivo exclusivos em sua compilação (CS9233, CS9234). Quando a compilação contiver caminhos de arquivo duplicados, renomeie ou reorganize arquivos para tornar cada caminho exclusivo. Verifique se o caminho do arquivo no atributo corresponde a um arquivo realmente incluído na compilação.
  • Validar pontos de dados de posição em locais de código válidos (CS9235). Os números de linha e caractere devem fazer referência a um ponto de interceptação válido dentro do arquivo especificado. Regenerar o atributo se o arquivo de origem for alterado ou se a posição estiver fora dos limites do arquivo.
  • Declare métodos interceptores não genéricos em tipos não genéricos (CS9138). Interceptores não podem ser declarados em tipos que têm parâmetros de tipo. Se você precisar interceptar um método genérico, crie um interceptor não genérico em um tipo contêiner não genérico que funcione com o tipo construído específico.
  • Torne interceptores métodos de membro ordinários (CS9146). Interceptores não podem ser operadores, construtores, finalizadores, propriedades ou indexadores. Declare o interceptor como um método estático ou de instância regular.
  • Interceptar invocações de método reais, não expressões (CS9151, CS9207). Você só pode interceptar chamadas para métodos de membro comuns que estão sendo invocados. Não é possível interceptar grupos de métodos, delegados ou métodos referenciados sem serem chamados. Verifique se o ponto de interceptação identifica uma chamada de método real.
  • Remova as tentativas de interceptação duplicadas (CS9153). Cada chamada de método só pode ser interceptada uma vez. Se várias InterceptsLocationAttribute instâncias tiverem como destino a mesma chamada, remova todas, exceto uma, para resolver a ambiguidade.
  • Não intercepte nameof operadores (CS9160). O nameof operador não invoca métodos em runtime, portanto, ele não pode ser interceptado. Interceptar apenas chamadas de método reais que são executadas em runtime.
  • Remover UnmanagedCallersOnlyAttribute de interceptadores (CS9161). Interceptadores devem poder ser chamados a partir de código gerenciado e não podem ser marcados com UnmanagedCallersOnlyAttribute. Remova o atributo da declaração do método interceptor.
  • Declare interceptadores em um namespace (CS9206). Interceptores não podem ser declarados no namespace global e devem estar contidos em pelo menos uma declaração de namespace. Encapsular sua classe interceptor em um namespace.
  • Resolva caminhos de arquivo duplicados no nível de compilação (CS9152). Quando vários arquivos compartilham o mesmo caminho na compilação, o compilador não pode determinar qual arquivo interceptar. Verifique se a configuração de build produz caminhos de arquivo exclusivos ou use uma estratégia de organização diferente para seus arquivos de origem.