Loại được xác định trước 'System.ValueTuple hè22 không được xác định hoặc nhập


385

Tôi đã cài đặt Visual Studio 15 Preview 3 và đã thử sử dụng tính năng tuple mới

static void Main(string[] args)
{
    var x = DoSomething();
    Console.WriteLine(x.x);
}

static (int x, int y) DoSomething()
{
    return (1, 2);
}

Khi tôi biên dịch, tôi gặp lỗi:

Loại được xác định trước 'System.ValueTuple hè22 không được xác định hoặc nhập

Theo bài đăng trên blog , tính năng này phải được "bật" theo mặc định.

Tôi đã làm gì sai?


3
Có ai biết nếu gói NuGet được yêu cầu ngay cả trong năm 2017 RTM nhắm mục tiêu 4.6.2 không? Có vẻ như bạn vẫn cần nó và tôi hy vọng rằng bạn sẽ không có trong phiên bản cuối cùng.
dmeglio

thay vào đó, bạn có thể thử sử dụng System.Tuple <int, int>
Kevin Xiao

Đối với tôi stackoverflow.com/a/46533630/4383425 này là giải pháp.
Andre

Câu trả lời:


528

Đối với .NET 4.6.2 trở xuống, .NET Core 1.x và .NET Standard 1.x bạn cần cài đặt gói NuGet System.ValueTuple:

Install-Package "System.ValueTuple"

Hoặc sử dụng tham chiếu gói trong VS 2017:

<PackageReference Include="System.ValueTuple" Version="4.4.0" />

.NET Framework 4.7, .NET Core 2.0 và .NET Standard 2.0 bao gồm các loại này.


3
Cảm ơn. Có nghĩa là nó sẽ hoạt động với 4.6.2? Trình gỡ lỗi vẫn hiển thị x.Item1 x.Item2. Thay vì (xx và xy) Bạn có biết nếu điều đó sẽ thay đổi?
gsharp

2
Cài đặt-Gói "System.ValueTuple" -IncludePrerelease
Frison Alexander

14
Chà, dường như không có trong 4.6.2.
binki 5/11/2016

12
Hoạt động với 4.6.2, vẫn cần gói này mặc dù.
Elisabeth

8
Với .NET 4.7, gói được bao gồm nguyên bản.
Mafii

40

Đó là một phần của .NET Framework 4.7.

Miễn là bạn không nhắm mục tiêu khung trên hoặc cao hơn (hoặc .NET Core 2.0/ .NET Standard 2.0), bạn sẽ cần tham khảo ValueTuple. Làm điều này bằng cách thêmSystem.ValueTuple NuGet Package


1
Tôi mới thử với .net 4.7 và nó không hoạt động? System.ValueTuple`2không tìm thấy
Bidou

Tôi đã cài đặt .net Framework 4.7 và gói mục tiêu cho Visual Studio. Tôi cũng đã chọn phiên bản 4.7 trong trình đơn thả xuống, nhưng nó vẫn không biên dịch.
Bidou

10
Ok tôi vừa tìm thấy vấn đề: dll System.ValueTuple đã được mã hóa cứng trong tệp dự án của tôi (csproj). Loại bỏ mục này khỏi tệp dự án đã khắc phục vấn đề.
Bidou

Giải pháp tốt, nhưng bạn có thể thêm chi tiết. Trong trường hợp của tôi, System.ValueTuple.dll vẫn bị treo trong thư mục bin của tôi. Một khi tôi xóa nó, tôi đã tốt để đi. Phiên bản ngôn ngữ của tôi là tại defaultvà tất cả đang làm việc.
chập chững


5

Đối với Visual Studio Code, sử dụng Terminal trong sẵn và chạy:

dotnet add package "System.ValueTuple"

Đừng quên chạy dotnet restoresau đó.


Tôi chưa thể có được điều này để làm việc trong VS Code.
JonathanPeel

10
Lưu ý: Đừng làm điều này với .Net 4.7
chập chững


3

Trong trường hợp những người khác có cùng một vấn đề, tôi gặp phải lỗi này sau khi cập nhật dự án lên 4.7. Thật kỳ lạ, tôi đã phải xóa tham chiếu System.ValueTuple để lỗi này biến mất.


3

Tôi không khuyên bạn nên thêm ValueTupledưới dạng tham chiếu gói cho các dự án .net Framework. Như bạn đã biết lắp ráp này có sẵn từ 4.7 .NET Framework.

Có thể có một số tình huống khi dự án của bạn sẽ cố gắng bao gồm bằng mọi giá ValueTupletừ thư mục .NET Framework thay vì thư mục gói và nó có thể gây ra một số lỗi không tìm thấy lắp ráp.

Chúng tôi đã có vấn đề này ngày hôm nay trong công ty. Chúng tôi đã có giải pháp với 2 dự án (tôi đơn giản hóa điều đó):

  • Lib
  • Web

Libđã bao gồm ValueTuple và Webđang sử dụng Lib. Hóa ra là do một số lý do nào đó Webkhi cố gắng con đường quyết tâm ValueTupleđã có HintPathvào thư mục .NET Framework và được tham gia phiên bản không chính xác. Ứng dụng của chúng tôi đã bị sập vì điều đó. ValueTuplekhông được quy định tại .csprojcác Webcũng không HintPathđể lắp ráp đó. Vấn đề rất kỳ lạ. Thông thường nó sẽ sao chép lắp ráp từ thư mục gói. Lần này không bình thường.

Đối với tôi luôn có rủi ro khi thêm các System.*tài liệu tham khảo gói. Chúng thường giống như quả bom hẹn giờ. Họ ổn khi bắt đầu và họ có thể nổ tung vào mặt bạn trong thời điểm tồi tệ nhất. Nguyên tắc nhỏ của tôi: Không sử dụng System.*gói Nuget cho .NET Framework nếu không có nhu cầu thực sự cho chúng.

Chúng tôi đã giải quyết vấn đề của mình bằng cách thêm thủ công ValueTuplevào .csprojtệp bên trong Webdự án.


1

Tôi cũng gặp phải vấn đề này khi tôi nâng cấp từ .NET 4.6.2 lên .NET 4.7.2. Thật không may, tôi không thể xóa tham chiếu gói System.ValueTuplevì một gói NuGet khác tôi sử dụng phụ thuộc vào gói đó.

Cuối cùng tôi đã có thể xác định nguyên nhân gốc: Có phiên bản .NET 4.6.2 mscorlib.dllnằm trong thư mục dự án (đầu ra của một hoạt động xuất bản) và MSBuild đã quyết định tham chiếu cụm này thay vì tham chiếu .NET 4.7.2 chính thức lắp ráp đặt tại C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.7.2.

Do System.ValueTuple được giới thiệu trong .NET 4.7, MSBuild đã thất bại trong quá trình biên dịch vì không thể tìm thấy kiểu trong tập hợp tham chiếu của .NET 4.6.2.

(bản sao của https://stackoverflow.com/a/57777123/128709 )


0

Tôi đã phải kiểm tra tệp System.ValueTuple.dll dưới sự kiểm soát nguồn và sửa tham chiếu của nó trong các tệp .cssproj:

  1. nhấp chuột phải vào từng dự án trong giải pháp
  2. dỡ dự án
  3. chỉnh sửa tập tin .cssproj: thay đổi

<Bao gồm tài liệu tham khảo = "System.ValueTuple">

<Gợi ý>

.... \ ProjectName \ ProjectName \ obj \ Release \ Gói \ GóiTmp \ bin \ System.ValueTuple.dll

</ Gợi ý>

</ Tham khảo>

vào

<Bao gồm tài liệu tham khảo = "System.ValueTuple">

<Gợi ý>

.. \ gói \ System.ValueTuple.4.4.0 \ lib \ netst Chuẩn1.0 \ System.ValueTuple.dll

</ Gợi ý>

</ Tham khảo>

  1. lưu các thay đổi và tải lại dự án
  2. tìm System.ValueTuple.dll và lưu nó vào thư mục này
  3. thêm tham chiếu của tệp này vào kiểm soát nguồn

(Tùy chọn): 7. giải quyết các vấn đề tương tự với các tập tin khác theo cách này


1
Mã hóa cứng một đường dẫn tệp cố định (hoặc bất kỳ chuỗi nào) không bao giờ là một giải pháp tốt.
Arghya C

0

Chúng tôi đã thấy vấn đề tương tự trong một trong những dự án cũ của chúng tôi đang nhắm mục tiêu Khung 4.5.2. Tôi đã thử một số kịch bản bao gồm tất cả các kịch bản được liệt kê ở trên: đích 4.6.1, thêm gói System.ValueTuple, xóa các thư mục bin, obj và .vs. Không có con xúc xắc. Lặp lại quy trình tương tự cho 4.7.2. Sau đó, đã thử gỡ bỏ gói System.ValueTuple vì tôi đang nhắm mục tiêu 4.7.2 như một người bình luận đề xuất. Vẫn không có gì. Đã kiểm tra đường dẫn tham chiếu tệp csproj. Có vẻ đúng. Thậm chí giảm xuống còn 4.5.2 và cài đặt lại gói. Tất cả điều này với một số VS khởi động lại và xóa cùng một thư mục nhiều lần. Nghĩa đen không có gì làm việc

Tôi đã phải cấu trúc lại để sử dụng một cấu trúc thay thế. Tôi hy vọng những người khác không tiếp tục gặp phải vấn đề này trong tương lai nhưng nghĩ rằng điều này có thể hữu ích nếu bạn kết thúc như bị vấp ngã như chúng ta.

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 cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.