Compartilhar via


Resolver avisos relacionados a recursos e versões de linguagem

Este artigo aborda os seguintes avisos do compilador:

  • CS8022, CS8023, CS8024, CS8025, CS8026, CS8059, CS8107, CS8302, CS8320, CS8370, CS8400, CS8773, CS8936, CS9058: O recurso não está disponível. Use uma versão de linguagem mais recente.
  • CS8058: O recurso é experimental.
  • CS8192: A versão de linguagem fornecida não tem suporte ou é inválida
  • CS8303: A versão de linguagem especificada não pode ter zeros à esquerda
  • CS8304: A versão do compilador é menor que a versão da linguagem
  • CS1738: As especificações de argumento nomeado devem aparecer depois que todos os argumentos fixos forem especificados.
  • CS8306: O nome do elemento de tupla é inferido.
  • CS8314: Uma expressão de tipo não pode ser manipulada por um padrão de tipo
  • CS8371: Os atributos direcionados a campo em propriedades automáticas não são compatíveis com a versão da linguagem
  • CS8401: Para usar @$ em vez de $@ para uma cadeia de caracteres verbatim interpolada, use uma versão de linguagem mais recente.
  • CS8511: Uma expressão de tipo não pode ser manipulada por um padrão de tipo.
  • CS8627: Um parâmetro de tipo que permite valor nulo deve ser sabidamente um tipo de valor ou um tipo de referência não anulável
  • CS8630: Opções anuláveis inválidas. Usar uma versão de linguagem mais recente
  • CS8652: O modificador não é válido para este item.
  • CS8704: O tipo não implementa o membro da interface. Ele não pode implementar implicitamente um membro não público.
  • CS8706: O tipo não pode implementar o membro da interface porque um recurso não está disponível nesta versão.
  • CS8904: Variação inválida: o parâmetro de tipo deve ser válido.
  • CS8912: Não há suporte para herdar de um registro com um 'Object.ToString' selado.
  • CS8919: não é possível implementar o membro da interface especificado no tipo porque o runtime de destino não dá suporte a membros abstratos estáticos em interfaces
  • CS8929: o método não pode implementar o membro da interface no tipo porque o runtime de destino não dá suporte a membros abstratos estáticos em interfaces.
  • CS8957: A expressão condicional não é válida na versão de linguagem porque um tipo comum não foi encontrado entre tipos.
  • CS8967: Não há suporte para novas linhas dentro de uma cadeia de caracteres interpolada não verbatim em C#
  • CS9014: Erro: uso de propriedade possivelmente não atribuída. Atualize para padronizar automaticamente a propriedade.
  • CS9015: Erro: uso de campo possivelmente não atribuído. Atualize para padronizar automaticamente o campo.
  • CS9016: Aviso: uso de propriedade possivelmente não atribuída. Atualize para padronizar automaticamente a propriedade.
  • CS9017: Aviso: uso de campo possivelmente não atribuído. Atualize para padronizar automaticamente o campo.
  • CS9064: O runtime de destino não dá suporte a campos ref.
  • CS9103: Definição em um módulo com uma versão refSafetyRulesAttribute não reconhecida, esperando '11'.
  • CS9171: O runtime de destino não dá suporte a tipos de matriz embutidos.
  • CS9194: O argumento pode não ser passado com a palavra-chave ref. Para passar argumentos ref para parâmetros in, atualize para o idioma versão 12 ou superior.
  • CS9202: O recurso não está disponível no C# 12.0. Use uma versão de linguagem mais recente
  • CS9211: O argumento diagnosticId para o atributo 'Experimental' deve ser um identificador válido.
  • CS9240: O runtime de destino não dá suporte a genéricos by-ref-like.
  • CS9260: O recurso não está disponível no C# 13.0. Por favor, use a versão mais recente do idioma*

Além disso, os seguintes erros e avisos estão relacionados a alterações de inicialização de struct em versões recentes:

  • CS0171, CS8881: O campo de suporte da propriedade autoimplementada 'name' deve ser totalmente atribuído antes de o controle ser retornado ao chamador.
  • CS0188, CS8885: O objeto 'this' não pode ser usado antes que todos os seus campos sejam atribuídos
  • CS0843, CS8880: O campo de suporte da propriedade autoimplementada 'name' deve ser totalmente atribuído antes de o controle ser retornado ao chamador
  • CS8305: O recurso é apenas para fins de avaliação e está sujeito a alterações ou remoção em atualizações futuras.
  • CS9204: O tipo é apenas para fins de avaliação e está sujeito a alterações ou remoção em atualizações futuras. Suprime esse diagnóstico para continuar.

A causa por trás de todos esses erros e avisos é que o compilador instalado dá suporte a uma versão mais recente do C# do que a versão selecionada pelo projeto. O compilador C# pode estar em conformidade com qualquer versão anterior. Você pode validar a sintaxe em relação a uma versão anterior do C# ou porque seu projeto deve dar suporte a bibliotecas ou runtimes mais antigos.

Há duas causas possíveis e três maneiras de resolver esses erros e avisos.

Atualizar a estrutura de destino

O compilador determina um padrão com base nestas regras:

Destino Versão Padrão da versão da linguagem C#
.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
.NET Core 3.x C# 8.0
.NET Core 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 all C# 7.3

Se a estrutura selecionada não corresponder à versão de linguagem necessária, você poderá atualizar a estrutura de destino.

Selecionar a versão da linguagem correspondente

Você pode ter uma estrutura de destino mais antiga selecionada no arquivo de projeto. Se você remover o elemento LangVersion do arquivo de projeto, o compilador usará o valor padrão listado na seção anterior. A tabela a seguir mostra todas as versões atuais da linguagem C#. Você também pode especificar uma versão de idioma específica para habilitar recursos mais recentes.

Valor Significado
preview O compilador aceita todas as sintaxes de linguagem válidas da versão prévia mais recente.
latest O compilador aceita a sintaxe da versão lançada mais recente do compilador (incluindo a versão secundária).
latestMajor
ou default
O compilador aceita a sintaxe da versão principal mais recente lançada do compilador.
13.0 O compilador aceita somente a sintaxe incluída no C# 13 ou inferior.
12.0 O compilador aceita somente a sintaxe incluída no C# 12 ou versão inferior.
11.0 O compilador aceita somente a sintaxe incluída no C# 11 ou inferior.
10.0 O compilador aceita somente a sintaxe incluída no C# 10 ou inferior.
9.0 O compilador aceita somente a sintaxe incluída no C# 9 ou inferior.
8.0 O compilador aceita somente a sintaxe incluída no C# 8.0 ou inferior.
7.3 O compilador aceita somente a sintaxe incluída no C# 7.3 ou inferior.
7.2 O compilador aceita somente a sintaxe incluída no C# 7.2 ou inferior.
7.1 O compilador aceita somente a sintaxe incluída no C# 7.1 ou inferior.
7 O compilador aceita somente a sintaxe incluída no C# 7.0 ou inferior.
6 O compilador aceita somente a sintaxe incluída no C# 6.0 ou inferior.
5 O compilador aceita somente a sintaxe incluída no C# 5.0 ou inferior.
4 O compilador aceita somente a sintaxe incluída no C# 4.0 ou inferior.
3 O compilador aceita somente a sintaxe incluída no C# 3.0 ou inferior.
ISO-2
ou 2
O compilador aceita somente a sintaxe incluída no ISO/IEC 23270:2006 C# (2.0).
ISO-1
ou 1
O compilador aceita somente a sintaxe incluída no ISO/IEC 23270:2003 C# (1.0/1.2).

Saiba mais sobre as versões de linguagem com suporte para cada versão da estrutura no artigo sobre Configurar versão do idioma na seção de referência de linguagem.

Evitar o recurso atualizado

Se você precisar dar suporte a bibliotecas ou runtimes mais antigos, talvez seja necessário evitar o uso de recursos mais recentes.

Habilitar recursos experimentais

O diagnóstico para recursos experimentais pode ser desabilitado para usar o recurso experimental.

Aviso

Os recursos experimentais estão sujeitos a alterações. As APIs podem ser alteradas ou podem ser removidas em atualizações futuras. Incluir recursos experimentais é uma maneira de os autores da biblioteca receberem comentários sobre ideias e conceitos para desenvolvimento futuro. Tenha extrema cautela ao usar qualquer recurso marcado como experimental.

Você também pode declarar seus próprios recursos experimentais usando o System.Diagnostics.CodeAnalysis.ExperimentalAttribute. O compilador emitirá CS9211 se o identificador usado para o recurso experimental não for um identificador válido.

Alterações interruptivas na inicialização do struct

Todos esses erros e avisos ajudam a garantir que os tipos struct sejam inicializados corretamente antes que seus campos sejam acessados. 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 para seu valor padrão. Em versões posteriores, todos os construtores inicializam todos os campos. O campo é definido explicitamente, definido em um inicializador de campo ou definido como seu valor padrão.

  • CS0171, CS8881: O campo de suporte da propriedade autoimplementada 'name' deve ser totalmente atribuído antes de o controle ser retornado ao chamador.
  • CS0188, CS8885: O objeto 'this' não pode ser usado antes que todos os seus campos sejam atribuídos
  • CS0843, CS8880: O campo de suporte da propriedade autoimplementada 'name' deve ser totalmente atribuído antes de o controle ser retornado ao chamador

Você pode resolver esse erro atualizando sua versão de linguagem para C# 11. Cada construtor struct inicializa todos os campos. Se essa não for uma opção possível, você deverá chamar explicitamente o construtor padrão, conforme mostrado no seguinte exemplo:

struct S
{
    public int AIProp { get; set; }
    public S(int i){} //CS0843
    // Try the following lines instead.
    // public S(int i) : this()
    // {
    //     AIProp = i;
    // }
}

class Test
{
    static int Main()
    {
        return 1;
    }
}