Fitur 'menggunakan deklarasi' tidak tersedia di C # 7.3. Silakan gunakan versi bahasa 8.0 atau lebih tinggi - Kesalahan pada satu mesin tetapi bekerja pada yang lain

24

Saat menggunakan Visual Studio Enterprise 16.3.7pada dua mesin terpisah, satu build baik-baik saja dan mesin lainnya melempar kesalahan:

Fitur 'menggunakan deklarasi' tidak tersedia di C # 7.3. Silakan gunakan versi bahasa 8.0 atau lebih tinggi.

masukkan deskripsi gambar di sini

masukkan deskripsi gambar di sini

Hal ini dapat dengan mudah dipecahkan pada mesin bekerja tidak dengan menetapkan LangVersiondalam .csprojseperti yang disarankan di sini https://stackoverflow.com/a/48085575/3850405 atau membiarkan Visual Studio secara otomatis memperbaikinya seperti print screen di atas.

<LangVersion>8.0</LangVersion>

Apa yang saya tidak mengerti adalah mengapa satu mesin dapat bekerja dengan baik tanpa saluran ini .csprojdan mesin lainnya membutuhkannya?

Ogglas
sumber
Jika Anda mendapatkan kesalahan seperti itu, itu berarti itu bukan proyek C # 8, atau Anda menggunakan versi Resharper dengan bug analisis
Panagiotis Kanavos
Apa TargetFramework dan LangVersion di csproj Anda?
Panagiotis Kanavos
@PanagiotisKanavos Ya tapi proyek ini dibangun di atas satu mesin dan bukan di yang lain - itulah yang saya tidak mengerti. ReSharper tidak digunakan.
Ogglas
Ini bisa berarti bahwa 3.0 SDK hilang pada satu mesin. Apa yang dotnet --list-sdksditunjukkan?
Panagiotis Kanavos
Kerangka target @PanagiotisKanavos .NET Framework 4.6.1dan LangVersiontidak disetel.
Ogglas

Jawaban:

20

Saya menerima kesalahan yang sama, tetapi saya lupa memasukkan

<LangVersion>8.0</LangVersion>

atribut dalam SEMUA file .csproj dalam solusi. Berikut ini adalah pengaturan c # 8 saya saat ini:

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

Saya menemukan dokumen-dokumen berikut ini yang paling membantu ketika bermigrasi dari inti 2.2 ke 3.x:

MSDN 2.2 -> 3.0

MSDN 3.0 -> 3.1

James LoForti
sumber
2
Anda dapat menggunakan <LangVersion>latest</LangVersion>sebagai gantinya<LangVersion>8.0</LangVersion>
Eliahu Aaron
1
Saya pikir tautan pertama MSDN 2.2 -> 3.0dimaksudkan untuk tautan ke yang berikut: docs.microsoft.com/en-us/aspnet/core/migration/22-to-30 Saya sudah mencoba mengedit jawaban untuk mengubahnya, tetapi "menyarankan mengedit antrian sudah penuh ", sebagai gantinya akan dikirim ke sini.
ahillier88
11

Ini bisa jadi karena kompiler menggunakan versi bahasa C # yang berbeda untuk Kerangka Target yang berbeda.

Untuk mengganti bahasa C # default, tambahkan ke file proyek (seperti yang disarankan dalam pertanyaan):

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

atau:

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

Lihat versi bahasa C # untuk versi bahasa C # default untuk kerangka kerja target yang berbeda dan cara memilih versi bahasa C # secara manual.

Lihat juga jawaban stack overflow Apakah C # 8 mendukung .NET Framework? untuk informasi lebih lanjut tentang topik ini.


Ini adalah bagian dari artikel versi bahasa C # :

Versi bahasa C #

Kompiler C # terbaru menentukan versi bahasa default berdasarkan kerangka kerja atau kerangka kerja target proyek Anda. Ini karena bahasa C # mungkin memiliki fitur yang bergantung pada tipe atau komponen runtime yang tidak tersedia di setiap implementasi .NET. Ini juga memastikan bahwa untuk target apa pun proyek Anda dibangun melawan, Anda mendapatkan versi bahasa yang kompatibel tertinggi secara default.

Aturan dalam artikel ini berlaku untuk kompiler yang dikirim dengan Visual Studio 2019 atau .NET Core 3.0 SDK. Kompiler C # yang merupakan bagian dari instalasi Visual Studio 2017 atau versi .NET Core SDK sebelumnya menargetkan C # 7.0 secara default.

Default

Kompiler menentukan default berdasarkan aturan-aturan ini:

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

Timpa default

Jika Anda harus menentukan versi C # secara eksplisit, Anda dapat melakukannya dengan beberapa cara:

  • Edit file proyek Anda secara manual.
  • Atur versi bahasa untuk beberapa proyek dalam subdirektori.
  • Konfigurasikan opsi kompilasi -langversion.

Edit file proyek

Anda dapat mengatur versi bahasa di file proyek Anda. Misalnya, jika Anda secara eksplisit ingin akses ke fitur pratinjau, tambahkan elemen seperti ini:

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

Nilai previewmenggunakan versi bahasa C # pratinjau terbaru yang tersedia yang didukung oleh kompiler Anda.

Konfigurasikan banyak proyek

Untuk mengkonfigurasi beberapa proyek, Anda bisa membuat file Directory.Build.props yang berisi <LangVersion>elemen. Anda biasanya melakukannya di direktori solusi Anda. Tambahkan berikut ini ke file Directory.Build.props di direktori solusi Anda:

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

Sekarang, membangun di setiap subdirektori dari direktori yang berisi file itu akan menggunakan versi pratinjau C #. Untuk informasi lebih lanjut, lihat artikel tentang Kustomisasi bangunan Anda .

Eliahu Aaron
sumber
8

Saya mengunduh versi terbaru .Net Core 3.0 dan 3.1 dan memiliki masalah yang sama. Bagi saya, perbaikannya sepertinya mengunduh pembaruan terbaru untuk Visual Studio 2019 (ke versi 16.4.2).

Ini juga me-restart komputer saya dan kesalahan hilang.

Singkat
sumber
Itu bukan nomor versi VS2019, mereka terlihat seperti 16.xy Gunakan Bantuan> Tentang.
Hans Passant
4.7.03056 adalah versi .NET Framework, versi VS terakhir saat ini adalah 16.4.4
Alex