Funkcja „używanie deklaracji” nie jest dostępna w C # 7.3. Proszę użyć wersji językowej 8.0 lub nowszej - Błąd na jednym komputerze, ale działa na innym

24

W przypadku używania Visual Studio Enterprise 16.3.7na dwóch osobnych komputerach jedna buduje się dobrze, a druga maszyna zgłasza błąd:

Funkcja „używanie deklaracji” nie jest dostępna w C # 7.3. Proszę użyć wersji językowej 8.0 lub nowszej.

wprowadź opis zdjęcia tutaj

wprowadź opis zdjęcia tutaj

To można łatwo rozwiązać na maszynie roboczej brak ustawiając LangVersionw .csprojjak sugeruje tutaj https://stackoverflow.com/a/48085575/3850405 albo niech Visual Studio automatycznie naprawić jak ekranie wydruku powyżej.

<LangVersion>8.0</LangVersion>

Nie rozumiem, dlaczego jedna maszyna dobrze się buduje bez tego wejścia, .csproja druga potrzebuje jej?

Ogglas
źródło
Jeśli pojawi się taki błąd, oznacza to, że nie jest to projekt C # 8, lub używasz wersji Resharper z błędem analizy
Panagiotis Kanavos
Co to jest TargetFramework i LangVersion w twoim csproj?
Panagiotis Kanavos
@PanagiotisKanavos Tak, ale projekt opiera się na jednej maszynie, a nie na drugiej - tego nie rozumiem. ReSharper nie jest używany.
Ogglas
Może to oznaczać, że brakuje zestawu SDK 3.0 na jednym komputerze. Co dotnet --list-sdkspokazuje
Panagiotis Kanavos
@PanagiotisKanavos Target framework .NET Framework 4.6.1i LangVersionnie jest ustawiony.
Ogglas

Odpowiedzi:

20

Otrzymałem ten sam błąd, ale po prostu zapomniałem dołączyć

<LangVersion>8.0</LangVersion>

atrybut we WSZYSTKICH plikach .csproj w rozwiązaniu. Oto moja obecna konfiguracja c # 8:

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

Uważam, że następujące dokumenty są najbardziej pomocne podczas migracji z rdzenia 2.2 do 3.x:

MSDN 2.2 -> 3.0

MSDN 3.0 -> 3.1

James LoForti
źródło
2
Możesz użyć <LangVersion>latest</LangVersion>zamiast<LangVersion>8.0</LangVersion>
Eliahu Aaron
Myślę, że pierwszy link MSDN 2.2 -> 3.0powinien zawierać link do następujących dokumentów: docs.microsoft.com/en-us/aspnet/core/migration/22-to-30 Próbowałem edytować odpowiedź, aby ją zmienić, ale „sugerowana kolejka edycji jest pełny ”, więc zamiast tego opublikuję tutaj.
ahillier88
10

Może to być spowodowane tym, że kompilator domyślnie używa różnych wersji językowych C # dla różnych struktur docelowych.

Aby zastąpić domyślny język C #, dodaj do pliku projektu (zgodnie z sugestią w pytaniu):

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

lub:

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

Zobacz Wersje językowe C #, aby uzyskać domyślne wersje językowe C # dla różnych platform docelowych i jak ręcznie wybrać wersję językową C #.

Zobacz także odpowiedź na temat przepełnienia stosu Czy C # 8 obsługuje .NET Framework? po więcej informacji na ten temat.


Oto część artykułu na temat wersji językowej C # :

Wersja językowa w C #

Najnowszy kompilator C # określa domyślną wersję językową na podstawie docelowych ram lub ram projektu. Wynika to z faktu, że język C # może mieć funkcje zależne od typów lub składników środowiska wykonawczego, które nie są dostępne w każdej implementacji platformy .NET. Zapewnia to również, że niezależnie od celu, na którym opiera się Twój projekt, domyślnie otrzymujesz najwyższą kompatybilną wersję językową.

Reguły w tym artykule dotyczą kompilatora dostarczanego z Visual Studio 2019 lub .NET Core 3.0 SDK. Kompilatory C #, które są częścią instalacji Visual Studio 2017 lub wcześniejszej wersji zestawu .NET Core SDK, domyślnie korzystają z C # 7.0.

Domyślne

Kompilator określa wartość domyślną na podstawie następujących reguł:

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

Zastąp ustawienie domyślne

Jeśli musisz jawnie określić swoją wersję C #, możesz to zrobić na kilka sposobów:

  • Ręcznie edytuj plik projektu.
  • Ustaw wersję językową dla wielu projektów w podkatalogu.
  • Skonfiguruj opcję kompilatora -langversion.

Edytuj plik projektu

Możesz ustawić wersję językową w pliku projektu. Na przykład, jeśli chcesz bezpośrednio uzyskać dostęp do funkcji podglądu, dodaj taki element:

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

Ta wartość previewkorzysta z najnowszej dostępnej wersji językowej C # podglądu obsługiwanej przez kompilator.

Skonfiguruj wiele projektów

Aby skonfigurować wiele projektów, możesz utworzyć plik Directory.Build.props zawierający ten <LangVersion>element. Zazwyczaj robisz to w katalogu rozwiązań. Dodaj następujące elementy do pliku Directory.Build.props w katalogu rozwiązania:

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

Teraz kompilacje w każdym podkatalogu katalogu zawierającego ten plik będą używać wersji zapoznawczej C #. Aby uzyskać więcej informacji, zobacz artykuł na temat dostosowywania kompilacji .

Eliahu Aaron
źródło
8

Pobrałem najnowszą wersję .Net Core 3.0 i 3.1 i miałem ten sam problem. Dla mnie poprawka zdawała się pobierać najnowszą aktualizację programu Visual Studio 2019 (do wersji 16.4.2).

Spowodowało to również ponowne uruchomienie komputera i błąd zniknął.

Lakoniczny
źródło
To nie jest numer wersji VS2019, wyglądają jak 16.xy Użyj pomocy> Informacje.
Hans Passant
4.7.03056 to wersja .NET Framework, ostatnia wersja VS to obecnie 16.4.4
Alex