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 argumentosref
para parâmetrosin
, 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;
}
}