Tidak dapat mengembalikan Tuple dari metode yang menggunakan Visual Studio 2017 dan C # 7.0

98

Saya telah menginstal Komunitas Visual Studio 2017 yang dirilis seminggu yang lalu, dan saya mulai menjelajahi fitur-fitur baru C # 7.

Jadi saya membuat metode sederhana yang mengembalikan dua nilai:

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

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

Kompiler menghasilkan kesalahan:

Kesalahan CS8137 Tidak dapat menentukan kelas atau anggota yang menggunakan tupel karena kompiler diperlukan jenis 'System.Runtime.CompilerServices.TupleElementNamesAttribute' tidak dapat ditemukan. Apakah Anda kehilangan referensi?

Saya mencoba menemukan referensi dalam kerangka dengan nama ini, tetapi tidak berhasil!

Jika kita membutuhkan barang tambahan untuk menggunakan fitur C # 7.0, maka sangat aneh bahwa kita perlu melakukannya untuk setiap proyek ?!

Zein Makki
sumber
Kemungkinan duplikat Mengaktifkan c # 7 di aplikasi asp.net
Hassan Abdullah

Jawaban:

129

Saya baru saja menjalankan halaman ini di Roslyn yang menjelaskan langkah-langkah berikut untuk membuatnya berfungsi:

  1. Mulai proyek C #
  2. Tambahkan referensi ke System.ValueTuple paket dari NuGet (pra-rilis)

masukkan deskripsi gambar di sini

Mengikuti langkah-langkah itu, sekarang berfungsi. Tapi sungguh sangat aneh bahwa kita perlu melakukan itu untuk setiap proyek yang kita mulai! Semoga ini diperbaiki ketika kami mencapai rilis Resmi!

Zein Makki
sumber
2
Satu hal yang harus ada di rilis berikutnya adalah perbaikan kode yang memungkinkan Anda menambahkan paket dengan mudah.
svick
6
Solusi ini membantu saya; bahkan dengan versi rilis penuh VS2017 Professional, diunduh pada Maret 2017!
Nij
2
Sangat kesal karena ini bukan bahasa resmi. Mengalami masalah yang sama dengan ini menjadi perbaikan. Mereka memasarkan ini sebagai fitur bahasa C # 7 padahal sebenarnya ini lebih merupakan fitur ekstensi C # 7. Saya kira hal-hal bisa menjadi berbulu seperti itu ketika Anda menggunakan kompiler Roslyn baru (yang saya penggemar) ... bagaimanapun juga, ini adalah efek samping IMO yang menyedihkan.
Michael Puckett II
10
@MichaelPuckettII Saya pikir ini karena fitur ini memerlukan classe (s) untuk ada dalam kerangka .NET dan mereka belum merilis yang baru, itulah mengapa solusi sementara adalah memasukkan ini sebagai Paket Nuget. Saat kerangka .NET berikutnya dirilis, kelas yang diperlukan untuk fitur ini harus sudah ada di dalamnya. Jika tidak, maka itu adalah masalah yang membutuhkan penjelasan.
Zein Makki
11
Setelah baru saja memutakhirkan ke .NET Framework 4.7, saya menerima kesalahan ini, ternyata ValueTuple sekarang menjadi bagian dari 4.7, jadi mencopot pemasangan paket tuple adalah solusi bagi saya
chad.mellor
52

Saya mulai mendapatkan kesalahan ini setelah saya menginstal .Net 4.7 Framework, dan mengubah proyek saya ke target .Net 4.7

ValueTuple sekarang disertakan dengan .Net 4.7, jadi Anda tidak perlu mereferensikan ValueTuple secara manual.

Yang harus saya lakukan untuk memperbaiki kesalahan kompilasi adalah menghapus referensi ke System.ValueTuple dari referensi proyek saya.

aaaa bbbb
sumber
1
Bagus, ikuti saran Anda, sekarang sudah termasuk dalam .NET 4.7, tidak perlu menginstal dari NuGet lagi. Terima kasih.
Gengjun Wu
dapatkah kita menggunakannya di .net. Ini 2019. Saya menargetkan .net 4.7.2
user4951
2

Saya juga mengalami masalah ini saat saya memutakhirkan dari .NET 4.6.2 ke .NET 4.7.2. Sayangnya, saya tidak dapat menghapus referensi paket System.ValueTuplekarena paket NuGet lain yang saya gunakan bergantung padanya.

Akhirnya saya dapat menemukan akar penyebabnya: Ada versi .NET 4.6.2 mscorlib.dlltergeletak di sekitar folder proyek (keluaran dari operasi publikasi) dan MSBuild memutuskan untuk mereferensikan rakitan ini daripada referensi resmi .NET 4.7.2 perakitan terletak di C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.7.2.

Karena fakta bahwa System.ValueTuple diperkenalkan di .NET 4.7, MSBuild gagal kompilasi karena tidak dapat menemukan jenis di rakitan referensi .NET 4.6.2.

Oliver Hanappi
sumber
1

Saya mendapat kesalahan ini juga setelah memperbarui ke .NET 4.7.2 dan dapat memperbaikinya dengan menginstal ulang paket nuget menggunakan:

Update-Package -Reinstall
martinoss.dll
sumber