Tính năng 'sử dụng khai báo' không khả dụng trong C # 7.3. Vui lòng sử dụng phiên bản ngôn ngữ 8.0 trở lên - Lỗi trên một máy nhưng hoạt động trên máy khác


24

Khi sử dụng Visual Studio Enterprise 16.3.7trên hai máy riêng biệt, một máy sẽ hoạt động tốt và máy kia sẽ báo lỗi:

Tính năng 'sử dụng khai báo' không khả dụng trong C # 7.3. Vui lòng sử dụng phiên bản ngôn ngữ 8.0 trở lên.

nhập mô tả hình ảnh ở đây

nhập mô tả hình ảnh ở đây

Điều này có thể dễ dàng được giải quyết trên máy làm việc không bằng cách thiết lập LangVersiontrong .csprojnhư đề xuất ở đây https://stackoverflow.com/a/48085575/3850405 hoặc để Visual Studio tự động sửa chữa nó như màn hình in trên.

<LangVersion>8.0</LangVersion>

Những gì tôi không thể hiểu là tại sao một máy xây dựng tốt mà không có dòng này .csprojvà máy kia cần nó?


Nếu bạn gặp lỗi như vậy, điều đó có nghĩa đó không phải là dự án C # 8 hoặc bạn sử dụng phiên bản Resharper với lỗi phân tích
— Panagiotis Kanavos

TargetFramework và LangVersion trong csproj của bạn là gì?
— Panagiotis Kanavos

@PanagiotisKanavos Có nhưng dự án xây dựng trên một máy chứ không phải trên máy kia - đó là điều tôi không hiểu. ReSharper không được sử dụng.
— Ogglas

Điều này có thể có nghĩa là SDK 3.0 bị thiếu trên một máy. Không dotnet --list-sdksthể hiện điều gì?
— Panagiotis Kanavos

@PanagiotisKanavos Khung mục tiêu .NET Framework 4.6.1và LangVersionkhông được đặt.
— Ogglas

Câu trả lời:


20

Tôi đã nhận được cùng một lỗi, nhưng tôi chỉ đơn giản là quên bao gồm

<LangVersion>8.0</LangVersion>

thuộc tính trong TẤT CẢ các tệp .csproj trong giải pháp. Sau đây là thiết lập c # 8 hiện tại của tôi:

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

Tôi thấy các tài liệu sau đây là hữu ích nhất khi di chuyển từ lõi 2.2 sang 3.x:

MSDN 2.2 -> 3.0

MSDN 3.0 -> 3.1


2
Bạn có thể sử dụng <LangVersion>latest</LangVersion>thay vì<LangVersion>8.0</LangVersion>
— Eliahu Aaron

1
Tôi nghĩ rằng liên kết đầu tiên MSDN 2.2 -> 3.0có nghĩa là liên kết đến sau: docs.microsoft.com/en-us/aspnet/core/migration/22-to-30 Tôi đã thử chỉnh sửa câu trả lời để sửa đổi nó, nhưng "đề xuất chỉnh sửa hàng đợi là đầy đủ ", vì vậy sẽ đăng ở đây để thay thế.
— ahillier88


10

Điều này có thể là do trình biên dịch sử dụng theo các phiên bản ngôn ngữ C # khác nhau cho các Khung mục tiêu khác nhau.

Để ghi đè ngôn ngữ C # mặc định, hãy thêm vào tệp dự án (như được đề xuất trong câu hỏi):

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

hoặc là:

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

Xem phiên bản ngôn ngữ C # cho các phiên bản ngôn ngữ C # mặc định cho các khung mục tiêu khác nhau và cách chọn thủ công phiên bản ngôn ngữ C #.

Xem thêm câu trả lời tràn ngăn xếp C # 8 có hỗ trợ .NET Framework không? để biết thêm thông tin về chủ đề này.


Đây là một phần của bài viết phiên bản ngôn ngữ C # :

Phiên bản ngôn ngữ C #

Trình biên dịch C # mới nhất xác định phiên bản ngôn ngữ mặc định dựa trên khung hoặc khung mục tiêu của dự án của bạn. Điều này là do ngôn ngữ C # có thể có các tính năng dựa trên các loại hoặc các thành phần thời gian chạy không có sẵn trong mỗi lần triển khai .NET. Điều này cũng đảm bảo rằng đối với bất kỳ mục tiêu nào mà dự án của bạn được xây dựng dựa trên, bạn sẽ có được phiên bản ngôn ngữ tương thích cao nhất theo mặc định.

Các quy tắc trong bài viết này áp dụng cho trình biên dịch được phân phối với Visual Studio 2019 hoặc .NET Core 3.0 SDK. Trình biên dịch C # là một phần của bản cài đặt Visual Studio 2017 hoặc các phiên bản .NET Core SDK trước đó nhắm mục tiêu C # 7.0 theo mặc định.

Mặc định

Trình biên dịch xác định mặc định dựa trên các quy tắc sau:

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

Ghi đè mặc định

Nếu bạn phải chỉ định rõ ràng phiên bản C # của mình, bạn có thể làm như vậy theo nhiều cách:

  • Chỉnh sửa thủ công tệp dự án của bạn.
  • Đặt phiên bản ngôn ngữ cho nhiều dự án trong thư mục con.
  • Cấu hình tùy chọn trình biên dịch -langversion.

Chỉnh sửa tập tin dự án

Bạn có thể đặt phiên bản ngôn ngữ trong tệp dự án của bạn. Ví dụ: nếu bạn rõ ràng muốn truy cập vào các tính năng xem trước, hãy thêm một yếu tố như thế này:

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

Giá trị previewsử dụng phiên bản ngôn ngữ C # xem trước mới nhất có sẵn mà trình biên dịch của bạn hỗ trợ.

Cấu hình nhiều dự án

Để cấu hình nhiều dự án, bạn có thể tạo tệp Directory.Build.props có chứa <LangVersion>phần tử. Bạn thường làm điều đó trong thư mục giải pháp của bạn. Thêm phần sau vào tệp Directory.Build.props trong thư mục giải pháp của bạn:

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

Bây giờ, các bản dựng trong mọi thư mục con của thư mục chứa tệp đó sẽ sử dụng phiên bản C # xem trước. Để biết thêm thông tin, hãy xem bài viết về Tùy chỉnh bản dựng của bạn .


8

Tôi đã tải xuống phiên bản mới nhất của .Net Core 3.0 và 3.1 và gặp vấn đề tương tự. Đối với tôi, bản sửa lỗi dường như tải xuống bản cập nhật mới nhất cho Visual Studio 2019 (đến phiên bản 16.4.2).

Điều này cũng khởi động lại máy tính của tôi và lỗi đã biến mất.


Đó không phải là số phiên bản VS2019, chúng trông giống như 16.xy Sử dụng Trợ giúp> Giới thiệu.
— Hans Passant

4.7.03056 là phiên bản .NET Framework, phiên bản VS cuối cùng hiện tại là 16.4.4
— Alex
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookie và Chính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.