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?
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.
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.ValueTuple
NuGet Package
hinzu.
Die ValueTuple-Typen sind in neuere Frameworks integriert:
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
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.
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.
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.
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.
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.
Ich musste überprüfen, ob die Datei System.ValueTuple.dll der Quellcodeverwaltung unterlag und ihren Verweis in .cssproj-Dateien korrigierte:
<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>
(Optional): 7. Lösen Sie auf diese Weise dieselben Probleme mit anderen DLL-Dateien