Tipe standar 'System.ValueTuple´2´ tidak didefinisikan atau diimpor


385

Saya telah menginstal Visual Studio 15 Pratinjau 3 dan mencoba menggunakan fitur tuple baru

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

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

Ketika saya kompilasi saya mendapatkan kesalahan:

Tipe standar 'System.ValueTuple´2´ tidak didefinisikan atau diimpor

Menurut posting blog , fitur ini harus "aktif" secara default.

Apa kesalahan yang telah aku perbuat?


3
Apakah ada yang tahu jika paket NuGet diperlukan bahkan di 2017 RTM menargetkan 4.6.2? Sepertinya Anda masih membutuhkannya dan saya berharap Anda tidak akan berada di versi final.
dmeglio

Anda dapat mencoba menggunakan System.Tuple <int, int> sebagai gantinya
Kevin Xiao

Bagi saya stackoverflow.com/a/46533630/4383425 ini adalah solusinya.
Andre

Jawaban:


528

Untuk .NET 4.6.2 atau lebih rendah, .NET Core 1.x, dan .NET Standard 1.x Anda harus menginstal paket NuGet System.ValueTuple:

Install-Package "System.ValueTuple"

Atau menggunakan referensi paket di VS 2017:

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

.NET Framework 4.7, .NET Core 2.0, dan .NET Standard 2.0 menyertakan tipe-tipe ini.


3
Terima kasih. Apakah ini berarti akan bekerja dengan 4.6.2? Debugger masih menampilkan x.Item1 x.Item2. Alih-alih (xx dan xy) Tahukah Anda jika itu akan berubah?
gsharp

2
Instal-Paket "System.ValueTuple" -IncludePrerelease
Frison Alexander

14
Ya, sepertinya tidak ada dalam 4.6.2.
binki

12
Bekerja dengan 4.6.2, masih membutuhkan paket ini.
Elisabeth

8
Dengan .NET 4.7, paket tersebut sudah termasuk di dalamnya.
Mafii

40

Itu bagian dari .NET Framework 4.7.

Selama Anda tidak menargetkan kerangka kerja di atas atau lebih tinggi (atau .NET Core 2.0/ .NET Standard 2.0), Anda perlu referensi ValueTuple. Lakukan ini dengan menambahkanSystem.ValueTuple NuGet Package


1
Saya baru saja mencoba dengan .net 4.7 dan tidak berhasil? System.ValueTuple`2tidak ditemukan
Bidou

Saya telah menginstal .net Framework 4.7 dan paket target untuk Visual Studio. Saya juga memilih versi 4.7 di drop down, tetapi masih tidak bisa dikompilasi.
Bidou

10
Ok saya baru saja menemukan masalah: System.ValueTuple dll telah hardcoded dalam file proyek saya (csproj). Menghapus entri ini dari file proyek memperbaiki masalah.
Bidou

Solusi yang bagus, tetapi Anda dapat menambahkan lebih banyak detail. Dalam kasus saya, System.ValueTuple.dll masih nongkrong di folder bin saya. Setelah saya menghapus itu, saya baik untuk pergi. Versi bahasa saya defaultaktif dan semua berfungsi.
toddmo


5

Untuk Visual Studio Code gunakan Terminal bawaan dan jalankan:

dotnet add package "System.ValueTuple"

Jangan lupa lari dotnet restoresetelahnya.


Saya belum bisa menjalankannya dalam Kode VS.
JonathanPeel

10
Catatan: Jangan lakukan ini dengan .Net 4.7
toddmo


3

Seandainya orang lain memiliki masalah yang sama, saya mengalami kesalahan ini setelah memperbarui proyek ke 4.7. Anehnya, saya harus menghapus referensi System.ValueTuple agar kesalahan ini hilang.


3

Saya tidak akan menyarankan menambahkan ValueTuplesebagai referensi paket untuk proyek .net Framework. Seperti yang Anda ketahui, rakitan ini tersedia dari 4.7 .NET Framework.

Mungkin ada situasi tertentu ketika proyek Anda akan mencoba untuk memasukkan di semua biaya ValueTupledari folder .NET Framework bukan folder paket dan itu dapat menyebabkan beberapa perakitan tidak menemukan kesalahan.

Kami memiliki masalah ini hari ini di perusahaan. Kami memiliki solusi dengan 2 proyek (saya terlalu menyederhanakan itu):

  • Lib
  • Web

Libtelah termasuk ValueTuple dan Websedang menggunakan Lib. Ternyata dengan beberapa alasan yang tidak diketahui Webketika mencoba untuk menyelesaikan path ke ValueTuplememiliki HintPathke .NET Framework direktori dan mengambil versi yang salah. Aplikasi kami macet karena itu. ValueTupletidak didefinisikan dalam .csprojdari Webatau HintPathuntuk perakitan itu. Masalahnya sangat aneh. Biasanya itu akan menyalin rakitan dari folder paket. Kali ini tidak normal.

Bagi saya selalu berisiko untuk menambahkan System.*referensi paket. Mereka sering seperti bom waktu. Mereka baik-baik saja di awal dan mereka dapat meledak di wajah Anda di saat terburuk. Aturan praktis saya: Jangan gunakan System.*paket Nuget untuk .NET Framework jika tidak ada kebutuhan nyata bagi mereka.

Kami menyelesaikan masalah kami dengan menambahkan secara manual ValueTupleke .csprojdalam file di dalam Webproyek.


1

Saya juga menemukan masalah ini ketika 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 tergantung padanya.

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

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

(duplikat https://stackoverflow.com/a/57777123/128709 )


0

Saya harus memeriksa file System.ValueTuple.dll di bawah kendali sumber dan memperbaiki rujukannya dalam file .cssproj:

  1. klik kanan setiap proyek dalam solusi
  2. membongkar proyek
  3. edit file .cssproj: ubah

<Referensi Sertakan = "System.ValueTuple">

<Petunjuk>

.... \ ProjectName \ ProjectName \ obj \ Release \ Package \ PackageTmp \ bin \ System.ValueTuple.dll

</ Petunjuk>

</ Referensi>

ke

<Referensi Sertakan = "System.ValueTuple">

<Petunjuk>

.. \ package \ System.ValueTuple.4.4.0 \ lib \ netstandard1.0 \ System.ValueTuple.dll

</ Petunjuk>

</ Referensi>

  1. simpan perubahan dan muat ulang proyek
  2. temukan System.ValueTuple.dll dan simpan ke folder ini
  3. tambahkan referensi file ini ke kontrol sumber

(Opsional): 7. selesaikan masalah yang sama dengan file .dll lainnya dengan cara ini


1
Hard coding jalur file tetap (atau string apa pun) tidak pernah merupakan solusi yang baik.
Arghya C

0

Kami melihat masalah yang sama di salah satu proyek lama kami yang menargetkan Kerangka Kerja 4.5.2. Saya mencoba beberapa skenario termasuk semua yang tercantum di atas: target 4.6.1, tambahkan paket System.ValueTuple, delete bin, obj, dan folder .vs. Tidak ada dadu. Ulangi proses yang sama untuk 4.7.2. Kemudian mencoba menghapus paket System.ValueTuple karena saya menargetkan 4.7.2 seperti yang disarankan seorang komentator. Tetap tidak ada. Memeriksa jalur referensi file csproj. Terlihat benar. Bahkan turun kembali ke 4.5.2 dan menginstal paket lagi. Semua ini dengan beberapa VS restart dan menghapus folder yang sama beberapa kali. Secara harfiah tidak ada yang berhasil.

Saya harus refactor untuk menggunakan struct sebagai gantinya. Saya berharap orang lain tidak terus mengalami masalah ini di masa depan tetapi berpikir ini mungkin membantu jika Anda akhirnya sama bingungnya dengan kami.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.