Tupel kann mit Visual Studio 2017 und C # 7.0 nicht von einer Methode zurückgegeben werden

98

Ich habe die vor einer Woche veröffentlichte Visual Studio 2017-Community installiert und die neuen Funktionen von C # 7 untersucht.

Also habe ich eine einfache Methode erstellt, die zwei Werte zurückgibt:

public class Program
{
    public static void Main(string[] args)
    {
        (int sum, int count) a = ReturnTwoValues();
    }

    static (int sum, int count) ReturnTwoValues() => (1, 1);
}

Der Compiler generiert einen Fehler:

Fehler CS8137 Eine Klasse oder ein Mitglied, das Tupel verwendet, kann nicht definiert werden, da der vom Compiler erforderliche Typ 'System.Runtime.CompilerServices.TupleElementNamesAttribute' nicht gefunden werden kann. Vermissen Sie eine Referenz?

Ich habe versucht, eine Referenz im Framework mit diesem Namen zu finden, aber ohne Glück!

Wenn wir zusätzliche Dinge benötigen, um C # 7.0-Funktionen nutzen zu können, ist es sehr seltsam, dass wir das für jedes Projekt tun müssen ?!

Zein Makki
quelle
Mögliches Duplikat der Aktivierung von c # 7 in einer asp.net-Anwendung
Hassan Abdullah

Antworten:

129

Ich habe gerade diese Seite auf Roslyn durchgesehen, auf der die folgenden Schritte beschrieben werden, damit dies funktioniert:

  1. Starten Sie ein C # -Projekt
  2. Fügen Sie einen Verweis auf das System.ValueTuple Paket von NuGet hinzu (Vorabversion)

Geben Sie hier die Bildbeschreibung ein

Nach diesen Schritten funktioniert es jetzt. Aber es ist wirklich sehr seltsam, dass wir das für jedes einzelne Projekt tun müssen, das wir starten! Hoffe, dies ist behoben, wenn wir die offizielle Veröffentlichung erreichen!

Zein Makki
quelle
2
Eine Sache, die in der nächsten Version enthalten sein sollte, ist ein Code-Fix, mit dem Sie das Paket einfach hinzufügen können.
Svick
6
Diese Lösung hat mir geholfen; auch mit der Vollversion von VS2017 Professional, die im März 2017 heruntergeladen wurde!
Nij
2
Sehr genervt, dass dies nicht in der Amtssprache ist. Bin auf das gleiche Problem gestoßen, da dies die Lösung ist. Sie vermarkten dies als C # 7-Sprachfunktion, obwohl es sich eher um eine C # 7-Erweiterungsfunktion handelt. Ich denke, die Dinge können so haarig werden, wenn Sie den neuen Roslyn-Compiler verwenden (von dem ich ein Fan bin) ... so oder so, das ist ein trauriger Nebeneffekt, IMO.
Michael Puckett II
10
@MichaelPuckettII Ich denke, das liegt daran, dass für diese Funktion Klassen im .NET Framework vorhanden sein müssen und sie noch keine neue veröffentlicht haben. Aus diesem Grund bestand eine vorübergehende Lösung darin, diese als Nuget-Paket aufzunehmen. Wenn das nächste .NET Framework veröffentlicht wird, sollten die für diese Funktion erforderlichen Klassen bereits integriert sein. Wenn nicht, dann ist das ein Problem, das einer Erklärung bedarf.
Zein Makki
11
Nachdem ich gerade ein Upgrade auf .NET Framework 4.7 durchgeführt habe, stellte sich heraus, dass ValueTuple jetzt Teil von 4.7 ist. Daher war die Deinstallation des
Tupelpakets
50

Ich habe diesen Fehler nach der Installation von .Net 4.7 Framework erhalten und mein Projekt in das Ziel .Net 4.7 geändert

ValueTuple ist jetzt in .Net 4.7 enthalten, sodass Sie das ValueTuple nicht mehr manuell referenzieren müssen.

Alles, was ich tun musste, um den Kompilierungsfehler zu korrigieren, war, den Verweis auf System.ValueTuple aus den Referenzen meines Projekts zu entfernen.

aaaa bbbb
quelle
1
Großartig, folgte Ihrem Vorschlag, jetzt ist es in .NET 4.7 enthalten, muss nicht mehr von NuGet installiert werden. Vielen Dank.
Gengjun Wu
können wir das schon auf .net verwenden. Es ist 2019. Ich ziele auf .net 4.7.2
user4951
2

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 auf 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.

Oliver Hanappi
quelle
1

Ich habe diesen Fehler auch nach dem Update auf .NET 4.7.2 erhalten und konnte ihn beheben, indem ich Nuget-Pakete mit folgenden Komponenten neu installierte:

Update-Package -Reinstall
Martinoss
quelle