Partilhar via


Resolver avisos relacionados a recursos e versões de idioma

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. Utilize uma versão linguística mais recente.
  • CS8058: O recurso é experimental.
  • CS8192: Versão de idioma fornecida não é suportada ou inválida
  • CS8303: Versão de idioma especificado não pode ter zeros à esquerda
  • CS8304: Versão do compilador é menor do que a versão de idioma
  • CS1738: As especificações de argumento nomeado devem aparecer depois que todos os argumentos fixos tiverem sido especificados.
  • CS8306: O nome do elemento Tuple é inferido.
  • CS8314: Uma expressão de tipo não pode ser manipulada por um padrão de tipo
  • CS8371: Atributos direcionados a campo em propriedades automáticas não são suportados na versão de idioma
  • CS8401: Para usar @$ em vez de $@ para uma cadeia de caracteres interpolada literal, use a versão mais recente da linguagem de programação.
  • CS8511: Uma expressão de tipo não pode ser manipulada por um padrão de tipo.
  • CS8627: Um parâmetro de tipo anulável deve ser conhecido por ser um tipo de valor ou um tipo de referência não anulável
  • CS8630: Opções anuláveis inválidas. Utilizar a versão linguística mais recente
  • CS8652: O modificador não é válido para este item.
  • CS8704: O tipo não implementa o membro da interface. 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 type 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 tempo de execução de destino não suporta membros abstratos estáticos em interfaces
  • CS8929: Método não pode implementar membro da interface no tipo porque o tempo de execução alvo não suporta membros abstratos estáticos em interfaces.
  • CS8957: A expressão condicional não é válida na versão de idioma porque um tipo comum não foi encontrado entre os tipos.
  • CS8967: Novas linhas dentro de uma cadeia de caracteres interpolada não literal não são suportadas em C#
  • CS9041: Requer uma funcionalidade do compilador que não é suportada por esta versão do compilador C#.
  • CS9014: Erro: Uso de propriedade possivelmente não atribuída. Atualize para o padrão automático da propriedade.
  • CS9015: Erro: Uso de campo possivelmente não atribuído. Atualize para que o campo tenha um valor padrão automático.
  • CS9016: Aviso: Uso de propriedade possivelmente não atribuída. Atualize para o padrão automático da propriedade.
  • CS9017: Aviso: Uso de campo potencialmente desatribuído. Configure o campo para valores padrão automáticos.
  • CS9064: O runtime de destino não suporta campos ref.
  • CS9103: Definição em um módulo com uma versão não reconhecida de RefSafetyRulesAttribute, esperando '11'.
  • CS9171: O tempo de execução de destino não suporta tipos de matriz em linha.
  • CS9194: Argumento não pode ser passado com a ref palavra-chave. Para passar ref argumentos para in parâmetros, atualize para a versão de idioma 12 ou superior.
  • CS9202: O recurso não está disponível no C# 12.0. Utilize a versão linguística mais recente
  • CS9211: O argumento diagnosticId para o atributo 'Experimental' deve ser um identificador válido.
  • CS9240: O tempo de execução de destino não é compatível com genéricos by-ref-like.
  • CS9260: O recurso não está disponível no C# 13.0. Utilize a versão linguística mais recente*
  • CS9268: O tipo é apenas para fins de avaliação e está sujeito a alterações ou remoção em atualizações futuras. Suprima este diagnóstico para prosseguir.
  • 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, selado, não estático, ter um construtor sem parâmetros, herdar de System.Attribute, e ser capaz de ser aplicado a qualquer tipo.
  • CS9327: O recurso não está disponível no C# 14.0. Utilize uma versão linguística mais recente.
  • CS9328: Método usa um recurso que não é suportado pelo ambiente de execução assíncrono atualmente.

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

  • CS0171, CS8881: O campo de suporte para 'nome' da propriedade implementada automaticamente deve ser totalmente atribuído antes que o controle seja retornado ao chamador.
  • CS0188, CS8885: O objeto 'this' não pode ser usado antes que todos os seus campos sejam atribuídos a
  • CS0843, CS8880: O campo de suporte para 'nome' da propriedade implementada automaticamente deve ser totalmente atribuído antes que o controle seja 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. Suprima este diagnóstico para prosseguir.

A causa por trás de todos esses erros e avisos é que o compilador instalado suporta uma versão mais recente do C# do que a versão que seu projeto selecionou. 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 oferecer suporte a bibliotecas ou tempos de execução mais antigos.

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

Atualize o seu framework alvo

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

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 a estrutura selecionada não corresponder à versão de idioma necessária, você poderá atualizar a estrutura de destino.

Selecione a versão do idioma correspondente

Você pode ter uma estrutura de destino mais antiga selecionada em seu arquivo de projeto. Se você remover o LangVersion elemento 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 do idioma C#. Você também pode especificar uma versão de idioma específico para habilitar recursos 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).

Você pode saber mais sobre as versões de idioma suportadas para cada versão da estrutura no artigo Configurar versão de idioma na seção de referência de idioma.

Evite o recurso atualizado

Se você precisar oferecer suporte a bibliotecas ou tempos de execução mais antigos, talvez seja necessário evitar o uso de recursos mais recentes.

Ativar funcionalidades experimentais

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

Aviso

As características experimentais estão sujeitas a alterações. As APIs podem ser alteradas ou removidas em atualizações futuras. 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.

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

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

Todos esses erros e avisos ajudam a garantir que os tipos sejam inicializados corretamente antes que struct 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 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.

  • CS0171, CS8881: O campo de apoio para 'nome' da propriedade implementada automaticamente deve ser totalmente atribuído antes que o controle seja retornado ao chamador.
  • CS0188, CS8885: O objeto 'this' não pode ser usado antes que todos os seus campos sejam atribuídos a
  • CS0843, CS8880: O campo de armazenamento para a propriedade 'nome', implementada automaticamente, deve ser totalmente atribuído antes de o controle ser devolvido ao chamador

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

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;
    }
}

Atributos específicos da implementação

  • CS9271: O tipo 'Microsoft.CodeAnalysis.EmbeddedAttribute' deve ser não-genérico, interno, selado, não estático, ter um construtor sem parâmetros, herdar de System.Attribute, e ser capaz de ser aplicado a qualquer tipo.

O compilador gera a fonte para este atributo quando necessário para o seu código-fonte. Você não deve declarar esse tipo.