web-dev-qa-db-de.com

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

Ich habe Visual Studio 15 Preview 3 installiert und versucht, die neue Tuple-Funktion 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 bekomme ich den Fehler:

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

Laut dem Blogbeitrag sollten diese Funktionen standardmäßig aktiviert sein. 

Was habe ich falsch gemacht?

313
gsharp

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

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.

439
Eli Arbel

Es ist Teil des .NET Framework 4.7 .

Solange Sie nicht auf das obige Framework oder höher (oder .NET Core 2.0/.NET Standard 2.0) ausgerichtet sind, müssen Sie auf ValueTuple verweisen. Fügen Sie den System.ValueTupleNuGet Package hinzu.

35
Nikita

Die ValueTuple-Typen sind in neuere Frameworks integriert:

  • .NET Framework 4.7 
  • .NET Core 2.0 
  • Mono 5.0 
  • .Net Standard 2.0

Bis Sie eine dieser neueren Framework-Versionen als Ziel festlegen, müssen Sie auf das ValueTuple-Paket verweisen.

Weitere Informationen unter http://blog.monstuff.com/archives/2017/03/03/valuetuple-availability.html

13
Julien Couvreur

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

dotnet add package "System.ValueTuple"

Vergiss nicht, dotnet restore danach auszuführen.

5

Stellen Sie sicher, dass Sie .NET 4.6.2 Developer Pack für VS installiert haben, und ziehen Sie das System.ValueTuple-Paket von NuGet ab.

3
Poulad

Falls andere das gleiche Problem haben, bin ich nach dem Aktualisieren eines Projekts auf 4.7 auf diesen Fehler gestoßen. Seltsamerweise musste ich den Verweis System.ValueTuple entfernen, damit dieser Fehler behoben wird.

3
Javier Rosa

Ich würde nicht empfehlen, ValueTuple als Paketreferenz für die .net Framework-Projekte hinzuzufügen. Wie Sie wissen, ist diese Assembly in .NET Framework 4.7 verfügbar.

Es kann bestimmte Situationen geben, in denen Ihr Projekt unter allen Umständen versucht, ValueTuple aus dem .NET Framework-Ordner anstelle des Paketordners einzuschließen, und es kann zu Fehlern kommen, bei denen einige Assemblys nicht gefunden wurden.

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

  • Lib
  • Web

Lib enthielt ValueTuple und Web verwendete Lib. Es stellte sich heraus, dass aus einem unbekannten Grund Web beim Versuch, den Pfad zu ValueTuple aufzulösen, HintPath im .NET Framework-Verzeichnis vorhanden war und eine falsche Version verwendete. Unsere Anwendung stürzte deshalb ab. ValueTuple wurde in .csproj von Web und HintPath für diese Assembly nicht definiert. Das Problem war sehr seltsam. Normalerweise wird die Assembly aus dem Paketordner kopiert. Diese Zeit war nicht normal.

Für mich besteht immer das Risiko, System.* Paketreferenzen hinzuzufügen. 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 nicht für . NET Framework, wenn es keinen wirklichen Bedarf dafür gibt.

Wir haben das Problem behoben, indem wir ValueTuple manuell in die .csproj -Datei im Web -Projekt eingefügt haben.

1
Shoter

Wir sahen dasselbe Problem in einem unserer alten Projekte, das auf Framework 4.5.2 abzielte. Ich habe verschiedene Szenarien ausprobiert, einschließlich der 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 ausgewählt habe, wie ein Kommentator vorgeschlagen hat. Immer noch nichts. Überprüfter csproj-Dateireferenzpfad. Sieht richtig aus. Auch fiel zurück auf 4.5.2 und installieren Sie das Paket erneut. Dies alles 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 in Zukunft nicht mehr auf dieses Problem stoßen, aber ich dachte, dass dies hilfreich sein könnte, wenn Sie genauso ratlos sind wie wir.

0
Candace Wrather

Ich musste überprüfen, ob die Datei System.ValueTuple.dll der Quellcodeverwaltung unterlag und ihren Verweis in .cssproj-Dateien korrigierte:

  1. klicken Sie mit der rechten Maustaste auf jedes Projekt in der 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>

</ Reference>

in 

<Reference Include = "System.ValueTuple">

<HintPath> 

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

</ HintPath>

</ Reference>

  1. Änderungen speichern und Projekte neu laden
  2. suchen Sie nach System.ValueTuple.dll und speichern Sie es in diesem Ordner
  3. verweis auf diese Datei in die Quellcodeverwaltung einfügen

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

0