Der vordefinierte Typ 'System.ValueTuple´2´ ist nicht definiert oder importiert


385

Ich habe Visual Studio 15 Preview 3 installiert und versucht, die neue Tupelfunktion zu verwenden

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

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

Beim Kompilieren erhalte ich folgende Fehlermeldung:

Der vordefinierte Typ 'System.ValueTuple´2´ ist nicht definiert oder importiert

Laut dem Blog-Beitrag sollten diese Funktionen standardmäßig aktiviert sein.

Was habe ich falsch gemacht?


3
Weiß jemand, ob das NuGet-Paket auch 2017 für RTM Targeting 4.6.2 erforderlich ist? Es scheint, als ob Sie es noch brauchen und ich habe erwartet, dass Sie es in der endgültigen Version nicht tun würden.
Dmeglio

Sie können versuchen, stattdessen System.Tuple <int, int> zu verwenden
Kevin Xiao

Für mich war dieser stackoverflow.com/a/46533630/4383425 die Lösung.
Andre

Antworten:


528

Für .NET 4.6.2 oder niedriger, .NET Core 1.x und .NET Standard 1.x müssen Sie das NuGet-Paket installieren System.ValueTuple:

Install-Package "System.ValueTuple"

Oder verwenden Sie eine Paketreferenz in VS 2017:

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

.NET Framework 4.7, .NET Core 2.0 und .NET Standard 2.0 enthalten diese Typen.


3
Vielen Dank. Bedeutet das, dass es mit 4.6.2 funktionieren würde? Der Debugger zeigt weiterhin x.Item1 x.Item2 an. Anstelle von (xx und xy) Weißt du, ob sich das ändern wird?
Gsharp

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

14
Nun, es scheint nicht in 4.6.2 zu sein.
Binki

12
Funktioniert mit 4.6.2, benötigt dieses Paket jedoch weiterhin.
Elisabeth

8
In .NET 4.7 ist das Paket nativ enthalten.
Mafii

40

Es ist ein Teil der .NET Framework 4.7.

Solange Sie nicht auf das oben genannte Framework oder höher (oder .NET Core 2.0/ .NET Standard 2.0) abzielen , müssen Sie darauf verweisen ValueTuple. Fügen Sie dazu das hinzuSystem.ValueTuple NuGet Package


1
Ich habe es gerade mit .net 4.7 versucht und es hat nicht funktioniert? System.ValueTuple`2nicht gefunden
Bidou

Ich habe das .net Framework 4.7 und das Zielpaket für Visual Studio installiert. Ich habe auch die Version 4.7 in der Dropdown-Liste ausgewählt, aber sie wird immer noch nicht kompiliert.
Bidou

10
Ok, ich habe gerade das Problem gefunden: Die DLL System.ValueTuple wurde in meiner Projektdatei (csproj) fest codiert. Durch Entfernen dieses Eintrags aus der Projektdatei wurde das Problem behoben.
Bidou

Gute Lösung, aber Sie können weitere Details hinzufügen. In meinem Fall hing System.ValueTuple.dll immer noch in meinem bin-Ordner. Nachdem ich das gelöscht hatte, konnte ich loslegen. Meine Sprachversion ist bei defaultund alles funktioniert.
Toddmo


5

Verwenden Sie für Visual Studio Code das integrierte Terminal und führen Sie Folgendes aus:

dotnet add package "System.ValueTuple"

Vergiss nicht dotnet restoredanach zu rennen .


Ich konnte dies nicht in VS Code zum Laufen bringen.
JonathanPeel

10
Hinweis: Tun Sie dies nicht mit .Net 4.7
toddmo


3

Falls andere das gleiche Problem haben, ist dieser Fehler nach dem Aktualisieren eines Projekts auf 4.7 aufgetreten. Seltsamerweise musste ich die System.ValueTuple-Referenz entfernen, damit dieser Fehler behoben wurde.


3

Ich würde nicht empfehlen, ValueTupleals Paketreferenz zu den .net Framework-Projekten hinzuzufügen . Wie Sie wissen, ist diese Assembly in 4.7 .NET Framework verfügbar.

Es kann bestimmte Situationen geben, in denen Ihr Projekt versucht, um jeden Preis ValueTupleaus dem .NET Framework-Ordner anstelle des Paketordners aufzunehmen, und dies kann dazu führen, dass einige Assembly-Fehler nicht gefunden werden.

Wir hatten dieses Problem heute in Gesellschaft. Wir hatten eine Lösung mit 2 Projekten (das vereinfache ich zu stark):

  • Lib
  • Web

Libschloss ValueTuple ein und Webverwendete Lib. Es stellte sich heraus, dass aus einem unbekannten Grund Webbeim Versuch, den Pfad zu aufzulösen ValueTuple, HintPathin das .NET Framework-Verzeichnis wurde und eine falsche Version verwendet wurde. Unsere Anwendung stürzte deshalb ab. ValueTuplewurde nicht definiert .csprojder Webnoch HintPathfür die Montage. Das Problem war sehr seltsam. Normalerweise wird die Assembly aus dem Paketordner kopiert. Diese Zeit war nicht normal.

Für mich ist es immer riskant, Paketreferenzen hinzuzufügen System.*. Sie sind oft wie eine Zeitbombe. Sie sind am Anfang in Ordnung und können im schlimmsten Moment in Ihrem Gesicht explodieren. Meine Faustregel: Verwenden Sie das System.*Nuget-Paket für .NET Framework nicht, wenn es nicht wirklich benötigt wird.

Wir haben unser Problem gelöst, indem wir es manuell ValueTuplein die .csprojDatei innerhalb des WebProjekts eingefügt haben .


1

Ich bin auch auf dieses Problem gestoßen, als ich ein Upgrade von .NET 4.6.2 auf .NET 4.7.2 durchgeführt habe. Leider konnte ich den Paketverweis nicht entfernen, System.ValueTupleda ein anderes von mir verwendetes NuGet-Paket davon abhängt.

Endlich konnte ich die Grundursache finden: Im Projektordner lag eine .NET 4.6.2-Version mscorlib.dllherum (Ausgabe eines Veröffentlichungsvorgangs), und MSBuild entschied sich, diese Assembly anstelle der offiziellen .NET 4.7.2-Referenz zu referenzieren Montage befindet sich in C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.7.2.

Aufgrund der Tatsache, dass System.ValueTuple in .NET 4.7 eingeführt wurde, schlug MSBuild die Kompilierung fehl, da der Typ in der Referenzassembly von .NET 4.6.2 nicht gefunden werden konnte.

(Duplikat von https://stackoverflow.com/a/57777123/128709 )


0

Ich musste überprüfen, ob die Datei System.ValueTuple.dll unter Quellcodeverwaltung war, und ihre Referenz in .cssproj-Dateien korrigieren:

  1. Klicken Sie mit der rechten Maustaste auf jedes Projekt in Lösung
  2. Projekt entladen
  3. .cssproj-Datei bearbeiten: ändern

<Reference Include = "System.ValueTuple">

<HintPath>

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

</ HintPath>

</ Referenz>

in

<Reference Include = "System.ValueTuple">

<HintPath>

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

</ HintPath>

</ Referenz>

  1. Änderungen speichern und Projekte neu laden
  2. Suchen Sie System.ValueTuple.dll und speichern Sie es in diesem Ordner
  3. Fügen Sie der Quellcodeverwaltung die Referenz dieser Datei hinzu

(Optional): 7. Lösen Sie auf diese Weise dieselben Probleme mit anderen DLL-Dateien


1
Eine feste Codierung eines festen Dateipfads (oder einer beliebigen Zeichenfolge) ist niemals eine gute Lösung.
Arghya C

0

Wir haben dasselbe Problem in einem unserer alten Projekte gesehen, das auf Framework 4.5.2 abzielte. Ich habe verschiedene Szenarien ausprobiert, einschließlich aller oben aufgeführten: Ziel 4.6.1, Hinzufügen des System.ValueTuple-Pakets, Löschen der Ordner bin, obj und .vs. Kein Würfel. Wiederholen Sie den gleichen Vorgang für 4.7.2. Dann habe ich versucht, das System.ValueTuple-Paket zu entfernen, da ich 4.7.2 als Ziel hatte, wie ein Kommentator vorschlug. Immer noch nichts. Überprüfter csproj-Dateireferenzpfad. Sieht richtig aus. Sogar auf 4.5.2 zurückgefallen und das Paket erneut installiert. All dies mit mehreren VS-Neustarts und mehrmaligem Löschen derselben Ordner. Es hat buchstäblich nichts funktioniert.

Ich musste umgestalten, um stattdessen eine Struktur zu verwenden. Ich hoffe, dass andere auch in Zukunft nicht mehr auf dieses Problem stoßen, aber ich dachte, dies könnte hilfreich sein, wenn Sie genauso ratlos sind wie wir.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.