O recurso 'usando declarações' não está disponível no C # 7.3. Use o idioma versão 8.0 ou superior - Erro em uma máquina, mas funciona em outra

24

Ao usar Visual Studio Enterprise 16.3.7em duas máquinas separadas, uma é compilada e a outra gera o erro:

O recurso 'usando declarações' não está disponível no C # 7.3. Por favor, use o idioma versão 8.0 ou superior.

insira a descrição da imagem aqui

insira a descrição da imagem aqui

Isso pode ser facilmente resolvido na máquina trabalhando nenhum ajustando LangVersionem .csprojcomo sugerido aqui https://stackoverflow.com/a/48085575/3850405 ou deixar Visual Studio corrigi-lo automaticamente como a tela de impressão acima.

<LangVersion>8.0</LangVersion>

O que não consigo entender é por que uma máquina é compacta sem essa linha .csproje a outra precisa dela?

Ogglas
fonte
Se você receber esse erro, isso significa que é não um projeto C # 8, ou você usa uma versão ReSharper com um erro de análise
Panagiotis Kanavos
O que é TargetFramework e LangVersion no seu csproj?
Panagiotis Kanavos
@PanagiotisKanavos Sim, mas o projeto se baseia em uma máquina e não na outra - é isso que eu não entendo. ReSharper não é usado.
Ogglas
Isso pode significar que o SDK 3.0 está ausente em uma máquina. O que dotnet --list-sdksmostra?
Panagiotis Kanavos
@PanagiotisKanavos Target framework .NET Framework 4.6.1e LangVersionnão está definido.
Ogglas

Respostas:

20

Eu recebi o mesmo erro, mas simplesmente esqueci de incluir o

<LangVersion>8.0</LangVersion>

atributo em TODOS os arquivos .csproj na solução. A seguir, minha configuração atual do c # 8:

  <PropertyGroup>
    <TargetFramework>netcoreapp3.1</TargetFramework>
    <LangVersion>8.0</LangVersion>
    <Nullable>enable</Nullable>
    <NullableContextOptions>enable</NullableContextOptions>
  </PropertyGroup>

Eu achei os seguintes documentos os mais úteis ao migrar do núcleo 2.2 para o 3.x:

MSDN 2.2 -> 3.0

MSDN 3.0 -> 3.1

James LoForti
fonte
2
Você pode usar em <LangVersion>latest</LangVersion>vez de<LangVersion>8.0</LangVersion>
Eliahu Aaron
11
Acho que o primeiro link MSDN 2.2 -> 3.0deve ser vinculado ao seguinte: docs.microsoft.com/en-us/aspnet/core/migration/22-to-30 Tentei editar a resposta para alterá-la, mas "fila de edição sugerida está cheio ", então será publicado aqui.
ahillier88 21/04
11

Isso pode ocorrer porque o compilador usa, por padrão, versões diferentes da linguagem C # para diferentes Frameworks de Destino.

Para substituir o idioma C # padrão, adicione ao arquivo do projeto (conforme sugerido na pergunta):

<PropertyGroup>
   <LangVersion>8.0</LangVersion>
</PropertyGroup>

ou:

<PropertyGroup>
   <LangVersion>latest</LangVersion>
</PropertyGroup>

Consulte Versão do idioma C # para obter as versões padrão do idioma C # para as diferentes estruturas de destino e como selecionar manualmente a versão do idioma C #.

Consulte também a resposta de estouro de pilha O C # 8 suporta o .NET Framework? para mais informações sobre este tópico.


Aqui está parte do artigo de versão do idioma C # :

Controle de versão em linguagem C #

O compilador C # mais recente determina uma versão do idioma padrão com base na (s) estrutura (s) de destino do seu projeto. Isso ocorre porque a linguagem C # pode ter recursos que dependem de tipos ou componentes de tempo de execução que não estão disponíveis em todas as implementações do .NET. Isso também garante que, para qualquer destino em que seu projeto seja construído, você obtenha a versão mais alta do idioma compatível por padrão.

As regras deste artigo se aplicam ao compilador entregue com o Visual Studio 2019 ou o SDK do .NET Core 3.0. Os compiladores C # que fazem parte da instalação do Visual Studio 2017 ou das versões anteriores do .NET Core SDK têm como destino o C # 7.0 por padrão.

Predefinições

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

--------------------------------------------------------
Target framework | version | C# language version default
--------------------------------------------------------
.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
--------------------------------------------------------

Substituir um padrão

Se você precisar especificar explicitamente sua versão do C #, poderá fazê-lo de várias maneiras:

  • Edite manualmente seu arquivo de projeto.
  • Defina a versão do idioma para vários projetos em um subdiretório.
  • Configure a opção do compilador -langversion.

Edite o arquivo do projeto

Você pode definir a versão do idioma no seu arquivo de projeto. Por exemplo, se você desejar explicitamente acessar recursos de visualização, adicione um elemento como este:

<PropertyGroup>
   <LangVersion>preview</LangVersion>
</PropertyGroup>

O valor previewusa a versão mais recente da linguagem C # de visualização disponível, suportada pelo compilador.

Configurar vários projetos

Para configurar vários projetos, você pode criar um arquivo Directory.Build.props que contém o <LangVersion>elemento Você normalmente faz isso no diretório da solução. Adicione o seguinte a um arquivo Directory.Build.props no diretório da solução:

<Project>
 <PropertyGroup>
   <LangVersion>preview</LangVersion>
 </PropertyGroup>
</Project>

Agora, as compilações em todos os subdiretórios do diretório que contêm esse arquivo usarão a versão C # de visualização. Para obter mais informações, consulte o artigo Personalizar sua compilação .

Eliahu Aaron
fonte
8

Fiz o download da versão mais recente do .Net Core 3.0 e 3.1 e tive o mesmo problema. Para mim, a correção parecia baixar a atualização mais recente do Visual Studio 2019 (para a versão 16.4.2).

Isso também reiniciou meu computador e o erro desapareceu.

Curt
fonte
Esse não é o número da versão do VS2019, eles se parecem com 16.xy Use Ajuda> Sobre.
Hans Passant
4.7.03056 é uma versão do .NET Framework, a última versão do VS atualmente é 16.4.4
Alex