Predefiniowany typ „System.ValueTuple” 2 nie jest zdefiniowany ani importowany


385

Zainstalowałem Visual Studio 15 Preview 3 i próbowałem użyć nowej funkcji krotki

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

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

Podczas kompilacji pojawia się błąd:

Predefiniowany typ „System.ValueTuple” 2 nie jest zdefiniowany ani importowany

Zgodnie z postem na blogu ta funkcja powinna być domyślnie włączona.

Co zrobiłem źle?


3
Czy ktoś wie, czy pakiet NuGet jest wymagany nawet w 2017 RTM ukierunkowanym na 4.6.2? Wygląda na to, że nadal go potrzebujesz i spodziewałem się, że nie będzie w ostatecznej wersji.
dmeglio,

można spróbować użyć System.Tuple <int, int> zamiast
Kevin Xiao

Dla mnie ten stackoverflow.com/a/46533630/4383425 był rozwiązaniem.
Andre

Odpowiedzi:


527

W przypadku .NET 4.6.2 lub nowszej, .NET Core 1.x i .NET Standard 1.x należy zainstalować pakiet NuGet System.ValueTuple:

Install-Package "System.ValueTuple"

Lub przy użyciu odwołania do pakietu w VS 2017:

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

.NET Framework 4.7, .NET Core 2.0 i .NET Standard 2.0 obejmują te typy.


3
Dzięki. Czy to znaczy, że działałoby z 4.6.2? Debugger nadal pokazuje x.Item1 x.Item2. Zamiast (xx i xy) Czy wiesz, czy to się zmieni?
gsharp

2
Install-Package "System.ValueTuple" -IncludePrerelease
Frison Alexander

14
Cóż, wydaje się, że nie ma go w 4.6.2.
binki

12
Działa z 4.6.2, jednak wciąż potrzebuje tego pakietu.
Elisabeth,

8
W .NET 4.7 pakiet jest natywnie dołączony.
Mafii,

40

To część .NET Framework 4.7.

Dopóki nie kierujesz się na powyższą ramę lub wyższą (lub .NET Core 2.0/ .NET Standard 2.0), musisz odwoływać się ValueTuple. Zrób to, dodającSystem.ValueTuple NuGet Package


1
Właśnie próbowałem z .net 4.7 i to nie działało? System.ValueTuple`2nie znaleziono
Bidou

Zainstalowałem .NET Framework 4.7 i pakiet docelowy dla Visual Studio. Wybrałem również wersję 4.7 z menu rozwijanego, ale nadal się nie kompiluje.
Bidou

10
Ok właśnie znalazłem problem: dll System.ValueTuple został zapisany na stałe w moim pliku projektu (csproj). Usunięcie tego wpisu z pliku projektu naprawiło problem.
Bidou

Dobre rozwiązanie, ale możesz dodać więcej szczegółów. W moim przypadku plik System.ValueTuple.dll nadal wisiał w folderze bin. Po usunięciu tego byłem gotowy do pracy. Moja wersja językowa jest już dostępna defaulti wszystko działa.
toddmo


5

W przypadku programu Visual Studio Code użyj wbudowanego terminalu i uruchom:

dotnet add package "System.ValueTuple"

Nie zapomnij dotnet restorepóźniej biegać .


Nie udało mi się tego uruchomić w VS Code.
JonathanPeel,

10
Uwaga: Nie rób tego z .Net 4.7
toddmo


3

W przypadku, gdy inni mają ten sam problem, napotkałem ten błąd po zaktualizowaniu projektu do wersji 4.7. Co dziwne, musiałem usunąć odwołanie System.ValueTuple, aby ten błąd zniknął.


3

Nie radziłbym dodawać ValueTuplejako odwołania do pakietów projektów .NET Framework. Jak wiadomo ten zestaw jest dostępny z 4.7 .NET Framework.

Mogą wystąpić pewne sytuacje, w których projekt będzie próbował za wszelką cenę dołączyć ValueTuplefolder .NET Framework zamiast folderu pakietu, co może powodować błędy nie znaleziono zestawu.

Ten problem mieliśmy dzisiaj w towarzystwie. Mieliśmy rozwiązanie z 2 projektami (upraszczam to):

  • Lib
  • Web

Libzostała w tym ValueTuple i Webużywał Lib. Okazało się, że z jakiegoś nieznanego powodu Webprzy próbie rozwiązania ścieżki ValueTuplebyło przejście HintPathdo katalogu .NET Framework i przyjmowanie niepoprawnej wersji. Z tego powodu nasza aplikacja uległa awarii. ValueTuplenie zdefiniowano .csprojz Webani HintPathdla tego zespołu. Problem był bardzo dziwny. Zwykle kopiuje on zestaw z folderu pakietu. Ten czas nie był normalny.

Dla mnie zawsze jest ryzyko dodania System.*odniesień do pakietu. Często są jak bomba zegarowa. Na początku są w porządku i mogą wybuchnąć ci w twarz w najgorszym momencie. Moja System.*ogólna zasada: nie używaj pakietu Nuget dla .NET Framework, jeśli nie jest to naprawdę potrzebne.

Rozwiązaliśmy nasz problem, dodając ręcznie ValueTupledo .csprojpliku wewnątrz Webprojektu.


1

Natrafiłem również na ten problem, kiedy uaktualniłem .NET 4.6.2 do .NET 4.7.2. Niestety nie udało mi się usunąć odwołania do pakietu, System.ValueTupleponieważ zależy od niego inny pakiet NuGet, którego używam.

W końcu udało mi się zlokalizować główną przyczynę: mscorlib.dllw folderze projektu leżała wersja .NET 4.6.2 (wynik operacji publikowania), a MSBuild zdecydował się odwoływać do tego zestawu zamiast oficjalnej referencji .NET 4.7.2 montaż znajduje się w C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.7.2.

Z uwagi na fakt, że System.ValueTuple został wprowadzony w .NET 4.7, MSBuild nie powiódł się podczas kompilacji, ponieważ nie mógł znaleźć tego typu w zestawie referencyjnym .NET 4.6.2.

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


0

Musiałem sprawdzić, czy plik System.ValueTuple.dll jest pod kontrolą źródła i poprawić jego odniesienie w plikach .cssproj:

  1. kliknij prawym przyciskiem myszy każdy projekt w rozwiązaniu
  2. rozładuj projekt
  3. edytuj plik .cssproj: zmień

<Reference Include = "System.ValueTuple">

<HintPath>

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

</ HintPath>

</ Reference>

w

<Reference Include = "System.ValueTuple">

<HintPath>

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

</ HintPath>

</ Reference>

  1. zapisz zmiany i ponownie załaduj projekty
  2. znajdź System.ValueTuple.dll i zapisz go w tym folderze
  3. dodaj odniesienie do tego pliku do kontroli źródła

(Opcjonalnie): 7. w ten sposób rozwiąż te same problemy z innymi plikami .dll


1
Kodowanie na stałe ustalonej ścieżki do pliku (lub dowolnego łańcucha) nigdy nie jest dobrym rozwiązaniem.
Arghya C,

0

Ten sam problem występował w jednym z naszych starych projektów, który był ukierunkowany na Framework 4.5.2. Próbowałem kilku scenariuszy, w tym wszystkich wymienionych powyżej: cel 4.6.1, dodaj pakiet System.ValueTuple, usuń foldery bin, obj i .vs. Nie ma kości. Powtórz ten sam proces dla 4.7.2. Następnie spróbowałem usunąć pakiet System.ValueTuple, ponieważ celowałem w 4.7.2, jak sugerował jeden komentator. Wciąż nic. Sprawdzona ścieżka do pliku csproj. Wygląda dobrze. Nawet spadłem z powrotem do 4.5.2 i ponownie zainstalowałem pakiet. Wszystko to przy kilku restartach VS i kilkakrotnym usuwaniu tych samych folderów. Dosłownie nic nie działało.

Zamiast tego musiałem zrestrukturyzować użycie struktury. Mam nadzieję, że inni nie będą napotykać tego problemu w przyszłości, ale pomyślałem, że może to być pomocne, jeśli skończysz tak samo jak my.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.