Corrigir erros e advertências para características e versões da linguagem

Este artigo aborda os seguintes erros e avisos do compilador:

  • CS0171: O campo 'name' tem de ser completamente atribuído antes de o método devolver o controlo ao chamador. Considere atualizar para a versão da linguagem 'version' para inicializar automaticamente o campo com o valor predefinido.
  • CS0188: O objeto 'this' não pode ser utilizado antes de todos os seus campos terem sido inicializados. Considere atualizar para a versão de linguagem 'version' para atribuir automaticamente os valores predefinidos aos campos não inicializados.
  • CS0843: A propriedade autoimplementada 'name' deve ser completamente atribuída antes de o controlo ser devolvido ao chamador. Considere atualizar para a versão da linguagem 'version' para atribuir automaticamente o valor predefinido à propriedade.
  • CS1617: Opção 'option' inválida para /langversion. Use '/langversion:?' para listar os valores suportados.
  • CS1638: 'identificador' é um identificador reservado e não pode ser usado quando se utiliza o modo de versão da língua ISO
  • CS1738: As especificações de argumentos nomeados devem aparecer depois de todos os argumentos fixos terem sido especificados. Por favor, utilize a versão da linguagem 7.2 ou superior para permitir argumentos nomeados que não sejam terminais.
  • CS8021: Não foi encontrado valor para RuntimeMetadataVersion. Não foi encontrado nenhum assembly contendo System.Object nem foi especificado um valor para RuntimeMetadataVersion através de opções.
  • CS8022: A funcionalidade não está disponível em C# 1. Por favor, use a versão 2 da linguagem ou superior.
  • CS8023: A funcionalidade não está disponível em C# 2. Por favor, use a versão de linguagem 3 ou superior.
  • CS8024: A funcionalidade não está disponível em C# 3. Por favor, utilize a versão 4 ou superior.
  • CS8025: A funcionalidade não está disponível em C# 4. Por favor, utilize a versão 5 ou superior.
  • CS8026: Funcionalidade não está disponível em C# 5. Por favor, utilize a versão de linguagem 6 ou superior.
  • CS8058: A funcionalidade 'funcional' é experimental e não suportada; use '/features:feature' para ativar.
  • CS8059: A funcionalidade não está disponível em C# 6. Por favor, use a versão 7 ou superior.
  • CS8107: A funcionalidade não está disponível em C# 7.0. Por favor, utilize a versão 7.1 ou superior.
  • CS8192: A versão de idioma fornecida não é suportada ou é inválida: 'valor'.
  • CS8302: A funcionalidade não está disponível em C# 7.1. Por favor, utilize a versão de linguagem 7.2 ou superior.
  • CS8303: A versão especificada da linguagem 'valor' não pode ter zeros iniciais
  • CS8304: Versão do compilador: 'version'. Versão linguística: versão.
  • CS8305: 'tipo' é apenas para fins de avaliação e está sujeito a alterações ou remoção em futuras atualizações.
  • CS8306: O nome do elemento da tupla 'name' é inferido. Utilize a versão da linguagem 7.1 ou superior para aceder a um elemento pelo seu nome inferido.
  • CS8314: Uma expressão do tipo 'tipo' não pode ser gerida por um padrão do tipo 'tipo' na versão C#. Por favor, use a versão linguística 'versão' ou superior.
  • CS8320: Funcionalidade não está disponível em C# 7.2. Por favor, utilize a versão de linguagem 7.3 ou superior.
  • CS8370: A funcionalidade não está disponível em C# 7.3. Por favor, utilize a versão 8 ou superior.
  • CS8371: Atributos direcionados a campos nas autopropriedades não são suportados na versão 7.3 da linguagem. Por favor, utilize a versão 8.0 ou superior.
  • CS8400:A funcionalidade não está disponível em C# 8. Por favor, utilize a versão 9 ou superior.
  • CS8401: Para usar '@$' em vez de '$@' para uma cadeia interpolada literalmente, por favor use a versão da linguagem 8.0 ou superior.
  • CS8511:Uma expressão do tipo 'tipo' não pode ser processada por um padrão do tipo 'tipo'. Por favor, use a versão de linguagem 'versão' ou superior para corresponder a um tipo aberto com um padrão constante.
  • CS8627: Um parâmetro de tipo anulável tem de ser reconhecido como sendo um tipo de valor ou um tipo de referência não anulável, a menos que se utilize a versão da linguagem 'version' ou superior. Considere alterar a versão da linguagem ou adicionar uma restrição 'class', 'struct' ou de tipo.
  • CS8630: Valor inválido da opção 'option': 'value' para a versão de C#. Utilize a versão da linguagem 'version' ou superior.
  • CS8652: A funcionalidade está atualmente em Pré-visualização e não é suportada. Para usar as funcionalidades de Pré-visualização, utilize a versão de linguagem 'pré-visualização'.
  • CS8701: O ambiente de execução de destino não suporta implementação de interface por defeito.
  • CS8702: 'member' não pode implementar interface member 'member' no tipo 'type' porque o runtime de destino não suporta a implementação padrão da interface.
  • CS8703: O modificador 'modifier' não é válido para este item nesta versão de C#. Utilize a versão 8.0 da linguagem ou superior.
  • CS8704: 'type' não implementa o membro de interface 'member'. 'type' não pode implementar implicitamente um membro não público na versão C#. Por favor, use a versão linguística 'versão' ou superior.
  • CS8706: O tipo não pode implementar um membro de interface no tipo porque a funcionalidade não está disponível em C# 7.3.
  • CS8707: O runtime alvo não suporta acessibilidade 'protegida', 'protegida interna' ou 'privada protegida' para um membro de uma interface.
  • CS8773: A funcionalidade não está disponível em C# 9. Por favor, use a versão de linguagem 10 ou superior.
  • CS8830: O ambiente de execução de destino não suporta tipos de retorno covariantes em substituições. O tipo de retorno tem de ser 'type' para corresponder ao membro substituído 'member'.
  • CS8831: O ambiente de execução de destino não suporta tipos covariantes em sobreposições. O tipo tem de ser 'type' para corresponder ao membro substituído 'member'.
  • CS8888:a convenção de chamadas 'geridas' não pode ser combinada com especificadores de convenção de chamadas não geridas.
  • CS8889: O runtime alvo não suporta convenções de chamadas extensíveis ou padrão no ambiente de execução.
  • CS8890: O tipo 'tipo' não está definido.
  • CS8891: O tipo 'tipo' deve ser público para ser usado como convenção de chamada.
  • CS8904: Variância inválida: O parâmetro de tipo deve ser invariantemente válido em 'member', a menos que seja usada a versão da linguagem 9.0 ou superior.
  • CS8912: Herdar de um registo com um 'Object.ToString' selado não é suportado em C# 9.0. Por favor, utilize a versão da linguagem 10.0 ou superior.
  • CS8919: O runtime de destino não suporta membros abstratos estáticos nas interfaces.
  • CS8929: 'método' não pode implementar o membro da interface 'membro' no tipo 'tipo' porque o ambiente de execução de destino não suporta membros abstratos estáticos em interfaces.
  • CS8936: Funcionalidade não está disponível em C# 10. Por favor, use a versão 11 ou superior.
  • CS8957: A expressão condicional não é válida na versão 8.0 da linguagem porque não foi encontrado um tipo comum entre 'tipo' e 'tipo'. Para usar uma conversão por tipo alvo, atualize para a versão de língua 9.0 ou superior.
  • CS8967: Newlines dentro de uma cadeia interpolada não literal não são suportadas em C# 10.0. Por favor, utilize a versão 11.0 ou superior.
  • CS9014: Utilização da propriedade autoimplementada 'name' possivelmente não atribuída. Considere atualizar para a versão da linguagem 'version' para atribuir automaticamente um valor predefinido à propriedade.
  • CS9015: Utilização do campo possivelmente não atribuído 'name'. Considere atualizar para a versão da linguagem 'version' para atribuir automaticamente um valor predefinido ao campo.
  • CS9016: Utilização da propriedade autoimplementada possivelmente não atribuída 'name'. Considere atualizar para a versão da linguagem 'version' para atribuir automaticamente um valor predefinido à propriedade.
  • CS9017: Utilização do campo possivelmente não atribuído 'name'. Considere atualizar para a versão da linguagem 'version' para atribuir automaticamente um valor predefinido ao campo.
  • CS9041: 'type' requer a característica do compilador 'feature', que não é suportada por esta versão do compilador C#.
  • CS9058: A funcionalidade não está disponível em C# 11. Por favor, utilize a versão 12 ou superior.
  • CS9064: O runtime do alvo não suporta campos de referência.
  • CS9103: 'tipo' é definido num módulo com uma versão RefSafetyRulesAttribute não reconhecida, esperando '11'.
  • CS9171: O tempo de execução alvo não suporta tipos de array em linha.
  • CS9194: O argumento não pode ser passado com a palavra-chave 'ref'. Para passar argumentos 'ref' para parâmetros 'in', atualize para a versão 12 da linguagem ou superior.
  • CS9202: Funcionalidade não está disponível em C# 12.0. Por favor, use a versão 13 ou superior.
  • CS9204: 'tipo' destina-se apenas a fins de avaliação e está sujeito a alterações ou remoção em futuras atualizações. Suprima este diagnóstico para prosseguir.
  • CS9211:O argumento diagnosticId para o atributo 'Experimental' deve ser um identificador válido.
  • CS9240: O runtime de destino não suporta genéricos do tipo by-ref-like.
  • CS9260: A funcionalidade não está disponível em C# 13.0. Por favor, utilize a versão 14 ou superior.
  • CS9268: 'type' é apenas para fins de avaliação e está sujeito a alterações ou remoção em futuras atualizações: 'message'. Suprima este diagnóstico para prosseguir.
  • CS9269: UnscopedRefAttribute só é válido em C# 11 ou posterior, ou quando se tem como alvo net7.0 ou posterior.
  • CS9271: O tipo 'Microsoft. CodeAnalysis.EmbeddedAttribute' deve ser não genérico, interno, não-ficheiro, selado, não estático, ter um construtor sem parâmetros, herdar de System.Attribute, e poder ser aplicado a qualquer tipo.
  • CS9327: A funcionalidade não está disponível em C# 14.0. Por favor, use a versão linguística 'versão' ou superior.
  • CS9328: Método 'método' utiliza uma funcionalidade que atualmente não é suportada pelo assíncrono em tempo de execução. Desative o método do assíncrono em tempo de execução atribuindo-lhe 'System.Runtime.CompilerServices.RuntimeAsyncMethodGenerationAttribute(false)'.
  • CS9346: A atualização requer emitir uma implementação explícita da interface, que não é suportada pelo runtime sem reiniciar a aplicação.
  • CS9352: O tempo de execução alvo não suporta tipos de layout estendidos.

A causa por trás de todos estes erros e avisos é que ou o compilador ou o runtime não suportam uma funcionalidade que estás a usar. A resolução depende se o problema é um problema de configuração da versão da linguagem, uma incompatibilidade com a versão da linguagem, uma limitação no tempo de execução ou uma funcionalidade experimental.

Erros de configuração das versões da linguagem

  • CS1617: Opção 'option' inválida para /langversion. Use '/langversion:?' para listar os valores suportados.
  • CS1638: 'identificador' é um identificador reservado e não pode ser usado quando se utiliza o modo de versão da língua ISO
  • CS8192: A versão de idioma fornecida não é suportada ou é inválida: 'valor'.
  • CS8303: A versão especificada da linguagem 'value' não pode ter zeros à esquerda
  • CS8304: Versão do compilador: 'version'. Versão linguística: versão.

Estes erros indicam que a <LangVersion> definição no seu ficheiro de projeto ou a -langversion opção do compilador é inválida ou incompatível com o compilador instalado.

Corrige o <LangVersion> valor no ficheiro do seu projeto para uma string de versão válida da linguagem (CS1617, CS8192, CS8303). Os valores válidos incluem default, latest, preview, latestMajor, , ou um número de versão específico como 7.3, 8.0, 9.0, 1011, 12, , 13, , ou 14. Não inclua zeros à esquerda no número de versão. Consulte a versão da linguagem C# para a lista completa de valores suportados.

Sugestão

Para ver uma lista de versões de línguas suportadas, consulte a tabela neste artigo, compile com -langversion:?, ou defina <LangVersion>?</LangVersion> temporariamente no seu ficheiro de projeto antes de compilar.

Atualize o SDK .NET para uma versão cujo compilador suporta a versão da linguagem especificada (CS8304). Cada versão do compilador C# suporta versões de linguagem até um máximo específico. Se especificar uma versão da linguagem mais recente do que o compilador suporta, atualize o SDK.

Remova identificadores com sublinhado duplo ou altere a versão da linguagem de ISO-1 ou ISO-2 para uma versão mais recente (CS1638). Os modos da linguagem ISO reservam identificadores que contenham __ (sublinhados duplos) porque não cumprem a especificação ISO C#.

Note

O compilador C# atual já não produz o CS1638. Compiladores mais antigos emitiam este erro ao utilizar as versões da linguagem ISO-1 ou ISO-2.

O compilador determina a sua versão padrão da linguagem a partir do framework de destino:

Objetivo Versão Padrão da versão do idioma C#
.NET 11.x C# 15
.NET 10,x C# 14
.NET 9.x C# 13
.NET 8.x C# 12
.NET 7.x C# 11
.NET 6.x C# 10
.NET 5.x C# 9.0
Núcleo do .NET 3.x C# 8.0
Núcleo do .NET 2,x C# 7,3
.NET Standard 2.1 C# 8.0
.NET Standard 2.0 C# 7,3
.NET Standard 1.x C# 7,3
.NET Framework todos C# 7,3

Se remover o LangVersion elemento do seu ficheiro de projeto, o compilador usa o padrão para o framework de destino. Também pode especificar uma versão específica para permitir funcionalidades mais recentes:

Valor Significado
preview O compilador aceita toda a sintaxe de idioma válida da versão de visualização mais recente.
latest O compilador aceita a sintaxe da versão mais recente lançada do compilador (incluindo a versão menor).
latestMajor
ou default
O compilador aceita a sintaxe da última versão principal do compilador.
15.0 O compilador aceita apenas a sintaxe incluída em C# 15 ou inferior.
14.0 O compilador aceita apenas a sintaxe incluída no C# 14 ou inferior.
13.0 O compilador aceita apenas a sintaxe incluída no C# 13 ou inferior.
12.0 O compilador aceita apenas a sintaxe incluída no C# 12 ou inferior.
11.0 O compilador aceita apenas a sintaxe incluída no C# 11 ou inferior.
10.0 O compilador aceita apenas a sintaxe incluída no C# 10 ou inferior.
9.0 O compilador aceita apenas a sintaxe incluída no C# 9 ou inferior.
8.0 O compilador aceita apenas a sintaxe incluída no C# 8.0 ou inferior.
7.3 O compilador aceita apenas a sintaxe incluída no C# 7.3 ou inferior.
7.2 O compilador aceita apenas a sintaxe incluída no C# 7.2 ou inferior.
7.1 O compilador aceita apenas a sintaxe incluída no C# 7.1 ou inferior.
7 O compilador aceita apenas a sintaxe incluída no C# 7.0 ou inferior.
6 O compilador aceita apenas a sintaxe incluída no C# 6.0 ou inferior.
5 O compilador aceita apenas a sintaxe incluída no C# 5.0 ou inferior.
4 O compilador aceita apenas a sintaxe incluída no C# 4.0 ou inferior.
3 O compilador aceita apenas a sintaxe incluída no C# 3.0 ou inferior.
ISO-2
ou 2
O compilador aceita apenas a sintaxe incluída na ISO/IEC 23270:2006 C# (2.0).
ISO-1
ou 1
O compilador aceita apenas a sintaxe incluída na ISO/IEC 23270:2003 C# (1.0/1.2).

Para saber mais sobre as versões de linguagem suportadas para cada versão do framework, consulte Configurar versão de linguagem na secção de referência de linguagem.

Funcionalidade não disponível na versão de língua

  • CS1738: As especificações de argumento nomeado devem aparecer depois que todos os argumentos fixos tiverem sido especificados.
  • CS8022, CS8023, CS8024, CS8025, CS8026, CS8059, CS8107, CS8302, CS8320, CS8370, CS8400, CS8773, CS8936, CS9058, CS9202, CS9260, CS9327: A funcionalidade não está disponível em C# X. Por favor, use a versão Y ou superior.
  • CS8306: O nome do elemento do tuplo é inferido. Utilize a versão da linguagem 7.1 ou superior para aceder a um elemento pelo seu nome inferido.
  • CS8314: Uma expressão do tipo 'tipo' não pode ser gerida por um padrão do tipo 'tipo' na versão C#. Por favor, use a versão linguística 'versão' ou superior.
  • CS8371: Atributos direcionados a campos nas autopropriedades não são suportados na versão 7.3 da linguagem.
  • CS8401: Para usar '@$' em vez de '$@' para uma cadeia interpolada literalmente, por favor use a versão da linguagem 8.0 ou superior.
  • CS8511:Uma expressão do tipo 'tipo' não pode ser processada por um padrão do tipo 'tipo'. Por favor, use a versão de linguagem 'versão' ou superior para corresponder a um tipo aberto com um padrão constante.
  • CS8627: Um parâmetro de tipo anulável tem de ser conhecido como sendo um tipo de valor ou um tipo de referência não anulável, a menos que seja utilizada a versão da linguagem 'version' ou superior. Considere alterar a versão da linguagem ou adicionar uma restrição 'class', 'struct' ou uma restrição de tipo.
  • CS8630: Valor de 'opção' inválido: 'valor' para a versão C#. Por favor, use a versão linguística 'versão' ou superior.
  • CS8703: O modificador 'modificador' não é válido para este item na versão C#.
  • CS8704: 'type' não implementa o membro de interface 'member'. 'Type' não pode implementar implicitamente um membro não público.
  • CS8706: O tipo não pode implementar o membro da interface porque a funcionalidade não está disponível nesta versão.
  • CS8904: Variância inválida: O parâmetro de tipo deve ser invariantemente válido em 'member', a menos que seja usada a versão da linguagem 9.0 ou superior.
  • CS8912: Herdar de um registo com um 'Object.ToString' selado não é suportado em C# 9.0.
  • CS8957: A expressão condicional não é válida na versão 8.0 da linguagem porque não foi encontrado um tipo comum entre os tipos.
  • CS8967: Newlines dentro de uma cadeia interpolada não literal não são suportadas em C# 10.0.
  • CS9194: O argumento não pode ser passado com a palavra-chave 'ref'. Para passar argumentos 'ref' para parâmetros 'in', atualize para a versão 12 ou superior da linguagem.

Todos estes erros indicam que está a usar uma funcionalidade de linguagem que requer uma versão C# mais recente do que aquela que o seu projeto pretende atualmente. Para resolver estes erros, utilize uma das seguintes opções:

  • Atualize o framework de destino para que o compilador selecione automaticamente a versão da linguagem necessária. Cada framework de destino corresponde a uma versão padrão em C#. Por exemplo, o .NET 8 tem por defeito C# 12, o .NET 9 é C# 13 e o .NET 10 é C# 14. Consulte a tabela em Erros de configuração de versão da linguagem para o mapeamento completo.

  • Defina o <LangVersion> elemento no ficheiro do seu projeto para a versão necessária ou superior. Por exemplo, para ativar funcionalidades C# 12, adicione <LangVersion>12</LangVersion> a <PropertyGroup> no ficheiro do seu projeto.

Se não puderes atualizar, evita a funcionalidade que desencadeou o erro. A mensagem de erro indica a funcionalidade e a versão necessária. A lista seguinte fornece contexto adicional para erros específicos:

  • Use argumentos nomeados explicitamente para todos os argumentos, ou atualize para C# 7.2 ou mais tarde para usar argumentos nomeados que não terminam (CS1738).
  • Aceda aos elementos da tupla pelo seu nome declarado em vez do nome inferido, ou atualize para C# 7.1 ou posterior (CS8306).
  • Use $@"..." em vez de @$"..." para cadeias interpoladas literalmente em versões C# anteriores à 8.0 (CS8401).
  • Adicionar restrições explícitas de tipo aos parâmetros de tipo anuláveis, ou atualizar para C# 9 ou posterior, o que relaxa este requisito (CS8627).
  • Atualize para o C# 8.0 ou posterior para ativar as anotações de anulabilidade e o contexto de anulabilidade (CS8630).
  • Adicione conversões explícitas em expressões condicionais em que os dois ramos não têm um tipo comum, ou atualize para C# 9 ou posterior para expressões condicionais com tipo de destino (CS8957).
  • Mover as novas linhas para fora das expressões de strings interpoladas, ou atualizar para C# 11 ou mais tarde (CS8967).
  • Use a in palavra-chave em vez dela ref ao passar argumentos para in parâmetros, ou atualize para C# 12 ou posterior (CS9194).
  • Implementar membros de interface não públicos de forma explícita em vez de implicitamente, ou atualizar para C# 9 ou posterior (CS8704).

O runtime alvo não suporta funcionalidade

  • CS8021: Não foi encontrado valor para RuntimeMetadataVersion.
  • CS8701: O ambiente de execução de destino não suporta a implementação predefinida da interface.
  • CS8702: 'member' não pode implementar o membro de interface no tipo porque o ambiente de execução de destino não suporta a implementação padrão da interface.
  • CS8707: O runtime alvo não suporta acessibilidade 'protegida', 'protegida interna' ou 'privada protegida' para um membro de uma interface.
  • CS8830: O ambiente de execução de destino não suporta tipos de retorno covariantes em substituições.
  • CS8831: O ambiente de execução de destino não suporta tipos covariantes em sobrescritas.
  • CS8889: O runtime alvo não suporta convenções de chamadas extensíveis ou padrão no ambiente de execução.
  • CS8919: O runtime de destino não suporta membros abstratos estáticos nas interfaces.
  • CS8929: 'método' não pode implementar o membro de interface 'membro' no tipo 'tipo' porque o runtime alvo não suporta membros abstratos estáticos nas interfaces.
  • CS9041: 'type' requer a característica do compilador 'feature', que não é suportada por esta versão do compilador C#.
  • CS9064: O runtime de destino não suporta campos ref.
  • CS9103: 'tipo' é definido num módulo com uma versão RefSafetyRulesAttribute não reconhecida, esperando '11'.
  • CS9171: O tempo de execução de destino não suporta tipos de matriz em linha.
  • CS9240: O tempo de execução de destino não é compatível com genéricos by-ref-like.
  • CS9328: Método 'método' utiliza uma funcionalidade que atualmente não é suportada pelo assíncrono em tempo de execução. Desative o método do assíncrono em tempo de execução atribuindo-lhe 'System.Runtime.CompilerServices.RuntimeAsyncMethodGenerationAttribute(false)'.
  • CS9346: A atualização requer emitir uma implementação explícita da interface, que não é suportada pelo runtime sem reiniciar a aplicação.
  • CS9352: O tempo de execução alvo não suporta tipos de layout estendidos.

Estes erros diferem dos erros de versão do idioma porque atualizar apenas o <LangVersion>, por si só, não os resolve. O ambiente de execução de destino (especificado por <TargetFramework>) tem também de suportar a funcionalidade ao nível do CLR/runtime.

Atualize o ficheiro <TargetFramework> do seu projeto para uma versão que suporte a funcionalidade necessária. A lista seguinte mostra que funcionalidades requerem que tempo mínimo de execução:

  • Implementação padrão da interface, incluindo acesso protegido (CS8701, CS8702, CS8707): Requer .NET Core 3.0 / .NET 5+.
  • Membros abstratos estáticos em interfaces (CS8919, CS8929): Requerem .NET 7+.
  • Tipos de retorno covariantes (CS8830, CS8831): Requer .NET 5+.
  • Campos de referência (CS9064): Requer .NET 7+.
  • Tipos de matrizes embutidas (CS9171): Requer .NET 8+.
  • Genéricos do tipo by-ref (CS9240): Requer o .NET 9 ou superior.
  • Tipos de layout estendido (CS9352): Requer .NET 10+.
  • Convenções de chamadas extensíveis (CS8889): Requerem .NET 5+.
  • Funcionalidades assíncronas em tempo de execução (CS9328): Requer .NET 10+.

Atualize o SDK de .NET se o próprio compilador não suportar uma funcionalidade obrigatória do compilador (CS9041). Este erro indica que uma biblioteca referenciada utiliza funcionalidades de metadados que requerem uma versão mais recente do compilador.

Garantir que existe uma referência válida à biblioteca de execução principal (CS8021). Este aviso aparece normalmente ao compilar sem uma referência de runtime padrão. Especifique uma RuntimeMetadataVersion opção ou adicione uma referência a um conjunto que contenha System.Object.

Resolver RefSafetyRulesAttribute incompatibilidades de versões recompilando módulos dependentes com uma versão compatível do compilador (CS9103).

Reinicie a aplicação se encontrar este erro durante o recarregamento a quente (CS9346). Algumas alterações de Edit and Continue requerem reiniciar, porque o ambiente de execução não consegue emitir dinamicamente as implementações explícitas de interface necessárias.

Erros de ponteiro de função e convenção de chamada

  • CS8888:a convenção de chamadas 'geridas' não pode ser combinada com especificadores de convenção de chamadas não geridas.
  • CS8889: O runtime alvo não suporta convenções de chamadas extensíveis ou padrão no ambiente de execução.
  • CS8890: O tipo 'tipo' não está definido.
  • CS8891: O tipo 'tipo' deve ser público para ser usado como convenção de chamada.

Estes erros estão relacionados com declarações de ponteiro de função e os respetivos especificadores de convenção de chamada, introduzidos no C# 9.

Remover managed das listas de especificadores de convenção de chamada que também incluem especificadores não geridos (CS8888). A managed convenção de chamada é o padrão e não pode ser combinada com unmanaged especificadores como Cdecl, Stdcall, Thiscall, ou Fastcall.

Atualize a estrutura de destino para .NET 5 ou posterior para usar convenções de chamada extensíveis ou por padrão em tempo de execução (CS8889). O atributo UnmanagedCallersOnly e os tipos de convenção de chamada extensíveis requerem suporte em tempo de execução que não está disponível no .NET Core 3.1 nem em versões anteriores.

Certifique-se de que o tipo de convenção de chamada existe nas assemblies de referência (CS8890). Tipos de convenção de chamagem como CallConvCdecl, CallConvStdcall, CallConvThiscall, e CallConvFastcall são definidos em System.Runtime.CompilerServices. Se o tipo não for encontrado, adicione uma referência à biblioteca de runtime correta.

Torne tipos public de convenção de chamada personalizados (CS8891). Se definir um tipo de convenção de chamada personalizado, declare-o como public para o utilizar numa declaração de tipo de ponteiro para função.

Funcionalidades experimentais e de pré-visualização

  • CS8058: A funcionalidade 'feature' é experimental e não é suportada; use '/features:feature' para a ativar.
  • CS8305: 'tipo' é apenas para fins de avaliação e está sujeito a alterações ou remoção em futuras atualizações.
  • CS8652: A funcionalidade está atualmente em Pré-visualização e não é suportada. Para usar as funcionalidades de Pré-visualização, utilize a versão de linguagem 'pré-visualização'.
  • CS9204: 'tipo' destina-se apenas a fins de avaliação e está sujeito a alterações ou remoção em futuras atualizações. Suprima este diagnóstico para prosseguir.
  • CS9211: O argumento diagnosticId para o atributo 'Experimental' deve ser um identificador válido.
  • CS9268: 'type' é apenas para fins de avaliação e está sujeito a alterações ou remoção em futuras atualizações: 'message'. Suprima este diagnóstico para prosseguir.

Estes diagnósticos indicam que está a usar uma funcionalidade ou tipo que está marcado como experimental ou que só está disponível na versão de pré-visualização da linguagem.

Aviso

As características experimentais estão sujeitas a alterações. As APIs podem mudar, ou podem ser removidas em futuras atualizações. A inclusão de recursos experimentais é uma maneira de os autores de bibliotecas obterem feedback sobre ideias e conceitos para desenvolvimento futuro. Tenha muito cuidado ao usar qualquer recurso marcado como experimental.

Defina <LangVersion>preview</LangVersion> no seu ficheiro de projeto para usar funcionalidades da linguagem de pré-visualização (CS8652). As funcionalidades de pré-visualização ainda não estão finalizadas e podem mudar em lançamentos futuros.

Suprimir o ID diagnóstico específico para reconhecer a natureza experimental da API (CS8058, CS8305,CS9204, CS9268). Os autores das bibliotecas marcam as APIs com System.Diagnostics.CodeAnalysis.ExperimentalAttribute para indicar que estão sujeitas a alterações. Pode suprimir o diagnóstico usando #pragma warning disable ou adicionando o ID de diagnóstico no <NoWarn> seu ficheiro de projeto.

Certifique-se de que o diagnosticId argumento para [Experimental] é um identificador C# válido (CS9211). O identificador deve seguir as regras padrão de nomenclatura. Não pode conter espaços, caracteres especiais ou começar com um dígito. Também pode declarar as suas próprias características experimentais usando o System.Diagnostics.CodeAnalysis.ExperimentalAttribute.

Quebrando alterações na inicialização do struct

  • CS0171, CS8881: O campo 'nome' deve ser totalmente atribuído antes de o controlo ser devolvido ao chamador. Considere atualizar para a versão da língua 'versão' para auto-predefinir o campo.
  • CS0188,CS8885: O objeto 'this' não pode ser usado antes de todos os seus campos terem sido atribuídos. Considere atualizar para a versão 'version' da língua para automaticamente predefinir os campos não atribuídos.
  • CS0843, CS8880: A propriedade 'name' implementada automaticamente deve ser totalmente atribuída antes de o controlo ser devolvido ao chamador. Considere atualizar para a versão da língua 'version' para auto-depor a propriedade.
  • CS9014: Utilização da propriedade autoimplementada 'name' possivelmente não atribuída. Considere atualizar para a versão da linguagem 'version' para atribuir automaticamente um valor predefinido à propriedade.
  • CS9015: Utilização do campo possivelmente não atribuído 'name'. Considere atualizar para a versão da linguagem 'version' para atribuir automaticamente um valor por predefinição ao campo.
  • CS9016: Utilização da propriedade autoimplementada 'name' possivelmente não atribuída. Considere atualizar para a versão da linguagem 'version' para atribuir automaticamente um valor predefinido à propriedade.
  • CS9017: Utilização do campo possivelmente não atribuído 'name'. Considere atualizar para a versão da linguagem 'version' para atribuir automaticamente um valor predefinido ao campo.

Estes erros e avisos ajudam a garantir que os tipos struct são corretamente inicializados antes de se aceder aos respetivos campos. Em versões anteriores do C#, você deve atribuir explicitamente todos os campos em um struct em qualquer construtor. O construtor sem parâmetros inicializa todos os campos com seu valor padrão. Em versões posteriores, todos os construtores inicializam todos os campos. O campo é explicitamente definido, definido em um inicializador de campo ou definido como seu valor padrão.

Atualize para o C# 11 ou posterior, para que todos os construtores struct atribuam automaticamente os valores predefinidos a todos os campos (CS0171, CS0188, CS0843 e as respetivas contrapartes mais recentes CS8880, CS8881, CS8885). A partir de C# 11, o compilador inicializa automaticamente quaisquer campos que não estejam explicitamente definidos num construtor para os seus valores padrão.

Chama explicitamente o construtor padrão usando : this() in o teu construtor de struct se não conseguires atualizar para C# 11 (CS0171, CS0188,CS0843). Esta abordagem garante que todos os campos recebem os seus valores predefinidos antes do corpo do construtor executar:

struct S
{
    public int AIProp { get; set; }
    public S(int i) : this() // Ensures all fields are initialized
    {
        AIProp = i;
    }
}

Atribua todos os campos e auto-propriedades antes de usar this ou antes dos retornos do construtor (CS9014, CS9015, CS9016, CS9017). Estes diagnósticos aparecem quando um compilador mais recente deteta que pode estar a ler uma propriedade ou campo antes de este ter sido atribuído. Ou atribui explicitamente um valor ou atualiza para uma versão onde o auto-default elimine o aviso.

Atributos específicos da implementação

  • CS9269: UnscopedRefAttribute é válido apenas em C# 11 ou posterior, ou quando direcionado para net7.0 ou posterior.
  • CS9271: O tipo 'Microsoft. CodeAnalysis.EmbeddedAttribute' deve ser não genérico, interno, não-ficheiro, selado, não estático, ter um construtor sem parâmetros, herdar de System.Attribute, e poder ser aplicado a qualquer tipo.

Estes erros relacionam-se com atributos que são gerados pelo compilador ou ligados a versões específicas de runtime.

Atualize para C# 11 e .NET 7 ou posteriores para usar UnscopedRefAttribute (CS9269). Este atributo indica que um ref retorno ou ref struct parâmetro não tem um tempo de vida definido. Requer que tanto a versão da linguagem como o framework de destino cumpram os requisitos mínimos.

Não declare manualmente Microsoft.CodeAnalysis.EmbeddedAttribute (CS9271). O compilador gera automaticamente o código-fonte para este atributo quando necessário. Se tiver um tipo declarado manualmente com este nome, remova-o ou renomeie-o para evitar conflitos com a versão gerada pelo compilador.