Không thể trả lại Tuple từ một phương pháp sử dụng Visual Studio 2017 và C # 7.0


98

Tôi đã cài đặt Visual Studio 2017 Community được phát hành cách đây một tuần và tôi bắt đầu khám phá các tính năng mới của C # 7.

Vì vậy, tôi đã tạo một phương thức đơn giản trả về hai giá trị:

public class Program
{
    public static void Main(string[] args)
    {
        (int sum, int count) a = ReturnTwoValues();
    }

    static (int sum, int count) ReturnTwoValues() => (1, 1);
}

Trình biên dịch đang tạo ra lỗi:

Lỗi CS8137 Không thể xác định lớp hoặc thành viên sử dụng bộ giá trị vì không tìm thấy loại trình biên dịch yêu cầu 'System.Runtime.CompilerServices.TupleElementNamesAttribute'. Bạn đang thiếu một tài liệu tham khảo?

Tôi đã thử tìm một tham chiếu trong khuôn khổ với tên này, nhưng không may mắn!

Nếu chúng ta cần những thứ bổ sung để sử dụng các tính năng của C # 7.0, thì thật kỳ lạ khi chúng ta cần làm điều đó cho mọi dự án ?!


Câu trả lời:


129

Tôi vừa lướt qua trang này trên Roslyn , trong đó mô tả các bước sau để làm cho trang này hoạt động:

  1. Bắt đầu một dự án C #
  2. Thêm tham chiếu đến System.ValueTuple gói từ NuGet (bản phát hành trước)

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

Làm theo các bước đó, nó hiện đang hoạt động. Nhưng thực sự rất kỳ lạ là chúng ta cần phải làm điều đó cho mỗi dự án mà chúng ta bắt đầu! Hy vọng điều này sẽ được khắc phục khi chúng tôi phát hành chính thức!


2
Một điều nên có trong bản phát hành tiếp theo là bản sửa lỗi mã cho phép bạn dễ dàng thêm gói.
svick

6
Giải pháp này đã giúp tôi; ngay cả với phiên bản phát hành đầy đủ của VS2017 Professional, được tải xuống vào tháng 3 năm 2017!
Nij

2
Rất khó chịu vì điều này không có trong ngôn ngữ chính thức. Ran vào cùng một vấn đề với điều này là sửa chữa. Họ đang tiếp thị đây là một tính năng ngôn ngữ C # 7 trong khi trên thực tế, nó giống một tính năng mở rộng C # 7 hơn. Tôi đoán mọi thứ có thể trở nên rắc rối như vậy khi bạn đang sử dụng trình biên dịch Roslyn mới (mà tôi là một fan hâm mộ) ... dù bằng cách nào, đây là một tác dụng phụ đáng buồn IMO.
Michael Puckett II

10
@MichaelPuckettII Tôi nghĩ điều này là do tính năng này cần (các) classe để tồn tại trong .NET framework và họ chưa phát hành một cái mới, đó là lý do tại sao giải pháp tạm thời là đưa nó vào như một Nuget Package. Khi khuôn khổ .NET tiếp theo được phát hành, các lớp cần thiết cho tính năng này phải được tích hợp sẵn. Nếu không, thì đó là một vấn đề cần một số lời giải thích.
Zein Makki

11
Sau khi chỉ nâng cấp lên .NET Framework 4.7 tôi nhận được lỗi này, lần lượt ra ValueTuple hiện là một phần của 4.7, vì vậy gỡ bỏ cài đặt các gói tuple là giải pháp đối với tôi
chad.mellor

50

Tôi bắt đầu gặp lỗi này sau khi cài đặt .Net 4.7 Framework và thay đổi dự án của mình thành target .Net 4.7

ValueTuple hiện được bao gồm trong .Net 4.7, vì vậy bạn không phải tham chiếu ValueTuple theo cách thủ công.

Tất cả những gì tôi phải làm để sửa lỗi biên dịch là xóa tham chiếu đến System.ValueTuple khỏi tham chiếu dự án của tôi.


1
Tuyệt vời, đã làm theo gợi ý của bạn, bây giờ nó đã được đưa vào .NET 4.7, không cần cài đặt từ NuGet nữa. Cảm ơn.
Gengjun Wu

chúng ta có thể sử dụng nó trên .net được không. Đó là năm 2019. Tôi nhắm mục tiêu cho .net 4.7.2
user4951

2

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. Rất tiếc, tôi không thể xóa tham chiếu gói System.ValueTuplevì một gói NuGet khác mà tôi sử dụng phụ thuộc vào nó.

Cuối cùng tôi đã có thể xác định nguyên nhân gốc rễ: Có một phiên bản .NET 4.6.2 mscorlib.dllnằm xung quanh trong thư mục dự án (đầu ra của hoạt động xuất bản) và MSBuild đã quyết định tham chiếu hội đồng này thay vì tham chiếu .NET 4.7.2 chính thức lắp ráp nằm trong 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 không thể biên dịch vì nó không thể tìm thấy kiểu trong tổ hợp tham chiếu của .NET 4.6.2.


1

Tôi cũng gặp lỗi này sau khi cập nhật lên .NET 4.7.2 và có thể sửa nó bằng cách cài đặt lại gói nuget bằng cách sử dụng:

Update-Package -Reinstall
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.