Önceden tanımlı 'System.ValueTuple´2´ türü tanımlanmadı veya içe aktarılmadı


385

Visual Studio 15 Preview 3'ü yükledim ve yeni grup özelliğini kullanmaya çalıştım

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

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

Derlediğim zaman hatayı alıyorum:

Önceden tanımlı 'System.ValueTuple´2´ türü tanımlanmadı veya içe aktarılmadı

Göre blog post , bu özellikleri varsayılan olarak "açık" olmalıdır.

Neyi yanlış yaptım?


3
NuGet paketinin 2017 RTM hedef 4.6.2 hedeflemesinde bile gerekli olup olmadığını bilen var mı? Görünüşe göre hala ihtiyacınız var ve son sürümde olmayacağınızı umuyordum.
dmeglio

bunun yerine System.Tuple <int, int> kullanmayı deneyebilirsiniz
Kevin Xiao

Benim için bu stackoverflow.com/a/46533630/4383425 çözüm oldu.
Andre

Yanıtlar:


528

.NET 4.6.2 veya önceki sürümleri, .NET Core 1.x ve .NET Standard 1.x için NuGet paketini yüklemeniz gerekir System.ValueTuple:

Install-Package "System.ValueTuple"

Veya VS 2017'de bir paket referansı kullanarak:

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

.NET Framework 4.7, .NET Core 2.0 ve .NET Standard 2.0 bu türleri içerir.


3
Teşekkürler. 4.6.2 ile çalışacağı anlamına mı geliyor? Hata Ayıklayıcı hala x.Item1 x.Item2'sini gösterir. (Xx ve xy) yerine bunun değişip değişmeyeceğini biliyor musunuz?
gsharp

2
Kurulum Paketi "System.ValueTuple" -IncludePrerelease
Alexander

14
4.6.2'de görünmüyor.
binki

12
4.6.2 ile çalışır, yine de bu pakete ihtiyaç duyar.
Elisabeth

8
.NET 4.7 ile paket yerel olarak eklenir.
Mafii

40

Bunun bir parçası .NET Framework 4.7.

Yukarıdaki çerçeveyi veya daha üstünü (veya .NET Core 2.0/ .NET Standard 2.0) hedeflemediğiniz sürece referans vermeniz gerekir ValueTuple. Bunu ekleyerekSystem.ValueTuple NuGet Package


1
Ben sadece .net 4.7 ile denedim ve işe yaramadı? System.ValueTuple`2bulunamadı
Bidou

Visual Studio için .net Framework 4.7 ve hedef paketi yükledim. Ayrıca açılır menüden 4.7 sürümünü seçtim, ancak yine de derlenmiyor.
Bidou

10
Tamam sadece sorunu buldum: dll System.ValueTuple proje dosyamda (csproj) sabit kodlanmış. Bu girdinin proje dosyasından kaldırılması sorunu çözdü.
Bidou

İyi bir çözüm, ancak daha fazla ayrıntı ekleyebilirsiniz. Benim durumumda, System.ValueTuple.dll hala benim bin klasörde asılı idi. Bunu sildiğimde, gitmeye iyiydim. Benim dil sürümüm var defaultve her şey çalışıyor.
toddmo


5

İçin Visual Studio Kodu yerleşik kullanmak Terminali ve run:

dotnet add package "System.ValueTuple"

Sonra koşmayı unutma dotnet restore.


Ben VS Kod çalışmak için elde edemedim.
JonathanPeel

10
Not: Bunu
.net


3

Diğerlerinin de aynı sorunu yaşaması durumunda, bir projeyi 4.7'ye güncelledikten sonra bu hatayla karşılaştım. İşin garibi, bu hatanın ortadan kalkması için System.ValueTuple referansını kaldırmak zorunda kaldım.


3

ValueTuple.Net Framework projelerine paket referansı eklemeyi tavsiye etmem . Bildiğiniz gibi bu derleme 4.7 .NET Framework'ten edinilebilir.

Projenizin ValueTuplepaket klasörü yerine .NET Framework klasöründen her ne pahasına olursa olsun dahil etmeye çalışacağı bazı durumlar olabilir ve bazı derleme bulunamadı hatalarına neden olabilir.

Bu sorunu bugün şirkette yaşadık. 2 projeyle çözümümüz vardı (bunu basitleştiriyorum):

  • Lib
  • Web

LibValueTuple dahil ve Webkullanıyordu Lib. Bilinmeyen bir nedenden dolayı Webyolunu çözmeye çalışırken .NET Framework dizinine ValueTuplesahip HintPatholduğu ve yanlış sürüm aldığı ortaya çıktı. Uygulamamız bu yüzden çöküyordu. ValueTupletanımlanmamıştır .csprojait Webne de HintPatho montaj için. Sorun çok garipti. Normalde derleme paket klasöründen kopyalanır. Bu sefer normal değildi.

Benim için her zaman System.*paket referansları eklemek risklidir . Genellikle bomba gibidirler. Başlangıçta iyi durumdalar ve en kötü anda yüzünüzde patlayabilirler. System.*Temel kuralım : Eğer gerçek bir ihtiyaç yoksa .NET Framework için Nuget paketini kullanmayın .

Proje içindeki dosyaya manuel ValueTupleolarak ekleyerek sorunumuzu çözdük..csprojWeb


1

.NET 4.6.2'den .NET 4.7.2'ye yükselttiğimde de bu sorunla karşılaştım. Ne yazık ki, System.ValueTuplekullandığım başka bir NuGet paketi buna bağlı olduğu için paket referansını kaldıramadım .

Sonunda temel nedeni bulabildim: mscorlib.dllProje klasöründe (yayımlama işleminin çıktısı) bir .NET 4.6.2 sürümü bulunuyordu ve MSBuild resmi .NET 4.7.2 başvurusu yerine bu derlemeye başvurmaya karar verdi montajda bulunan C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.7.2.

System.ValueTuple .NET 4. 0'da tanıtıldığı için, MSBuild .NET 4.6.2 başvuru derlemesinde türü bulamadığı için derleme başarısız oldu.

( https://stackoverflow.com/a/57777123/128709 kopyası )


0

System.ValueTuple.dll dosyasının kaynak denetimi altında olduğunu kontrol etmek ve .cssproj dosyalarındaki başvurusunu düzeltmek zorunda kaldım:

  1. çözümdeki her projeye sağ tıklayın
  2. projeyi boşalt
  3. .cssproj dosyasını düzenle: değiştir

<Reference Include = "System.ValueTuple">

<Hint Yolu>

.... \ ProjeAdı \ ProjeAdı \ obj \ Release \ Paketi \ PackageTmp \ bin \ System.ValueTuple.dll

</ HintYol>

</ Referans>

içine

<Reference Include = "System.ValueTuple">

<Hint Yolu>

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

</ HintYol>

</ Referans>

  1. değişiklikleri kaydetme ve projeleri yeniden yükleme
  2. System.ValueTuple.dll dosyasını bulun ve bu klasöre kaydedin
  3. kaynak kontrole bu dosyanın referansını ekle

(İsteğe bağlı): 7. başka bir .dll dosyalarıyla aynı sorunları bu şekilde çözün


1
Sabit bir dosya yolunu (veya herhangi bir dizeyi) sabit olarak kodlamak asla iyi bir çözüm değildir.
Arghya C

0

Aynı sorunu Çerçeve 4.5.2'yi hedefleyen eski projelerimizden birinde de görüyorduk. Yukarıda listelenenlerin tümünü içeren çeşitli senaryoları denedim: hedef 4.6.1, System.ValueTuple paketi ekleyin, bin, obj ve .vs klasörlerini silin. Nafile. 4.7.2 için aynı işlemi tekrarlayın. Daha sonra bir yorumcunun önerdiği gibi 4.7.2'yi hedeflediğimden beri System.ValueTuple paketini kaldırmayı denedim. Hala hiçbirşey. Kontrol edilen csproj dosyası referans yolu. Doğru görünüyor. Hatta 4.5.2'ye düştü ve paketi tekrar kurdu. Tüm bunlar birkaç VS ile yeniden başlatılır ve aynı klasörleri birkaç kez siler. Kelimenin tam anlamıyla hiçbir şey işe yaramadı.

Bunun yerine bir yapı kullanmak için yeniden düzenleme yapmak zorunda kaldım. Umarım diğerleri gelecekte bu sorunla karşılaşmaya devam etmezler, ancak bizim kadar güldüğünüzde bunun yararlı olabileceğini düşündüler.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.