Impossible de renvoyer Tuple à partir d'une méthode à l'aide de Visual Studio 2017 et C # 7.0

98

J'ai installé Visual Studio 2017 Community qui a été publié il y a une semaine et j'ai commencé à explorer les nouvelles fonctionnalités de C # 7.

J'ai donc créé une méthode simple qui renvoie deux valeurs:

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

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

Le compilateur génère une erreur:

Erreur CS8137 Impossible de définir une classe ou un membre qui utilise des tuples car le type requis par le compilateur «System.Runtime.CompilerServices.TupleElementNamesAttribute» est introuvable. Vous manquez une référence?

J'ai essayé de trouver une référence dans le cadre avec ce nom, mais sans succès!

Si nous avons besoin de choses supplémentaires pour utiliser les fonctionnalités de C # 7.0, alors il est très étrange que nous devions le faire pour chaque projet?!

Zein Makki
la source
Double possible de l' activation de c # 7 dans une application asp.net
Hassan Abdullah

Réponses:

129

Je viens de parcourir cette page sur Roslyn qui décrit les étapes suivantes pour que cela fonctionne:

  1. Démarrer un projet C #
  2. Ajouter une référence au System.ValueTuple package de NuGet (pré-version)

entrez la description de l'image ici

Suite à ces étapes, il fonctionne maintenant. Mais c'est vraiment très étrange que nous devions faire cela pour chaque projet que nous commençons! J'espère que cela sera corrigé lorsque nous atteindrons la version officielle!

Zein Makki
la source
2
Une chose qui devrait figurer dans la prochaine version est un correctif de code qui vous permet d'ajouter facilement le package.
svick
6
Cette solution m'a aidé; même avec la version complète de VS2017 Professional, téléchargée en mars 2017!
Nij
2
Très ennuyé que ce ne soit pas dans la langue officielle. Ran dans le même problème avec ceci étant le correctif. Ils commercialisent cela comme une fonctionnalité de langage C # 7 alors qu'en fait il s'agit davantage d'une fonctionnalité d'extension C # 7. Je suppose que les choses peuvent devenir velues comme ça lorsque vous utilisez le nouveau compilateur Roslyn (dont je suis fan) ... de toute façon, c'est un triste effet secondaire de l'OMI.
Michael Puckett II
10
@MichaelPuckettII Je pense que c'est parce que cette fonctionnalité a besoin de classe (s) pour exister dans le framework .NET et qu'ils n'en ont pas encore publié une nouvelle, c'est pourquoi une solution temporaire consistait à l'inclure en tant que package Nuget. Lors de la sortie du prochain framework .NET, les classes nécessaires à cette fonctionnalité doivent déjà être intégrées. Sinon, c'est un problème qui nécessite quelques explications.
Zein Makki
11
Après la mise à niveau vers .NET Framework 4.7, j'ai reçu cette erreur, il s'avère que ValueTuple fait maintenant partie de 4.7, donc la désinstallation du package tuple était la solution pour moi
chad.mellor
50

J'ai commencé à recevoir cette erreur après avoir installé .Net 4.7 Framework et changé mon projet pour cibler .Net 4.7

ValueTuple est maintenant inclus avec .Net 4.7, vous n'avez donc pas besoin de référencer le ValueTuple manuellement.

Tout ce que j'avais à faire pour corriger l'erreur de compilation était de supprimer la référence à System.ValueTuple des références de mon projet.

aaaa bbbb
la source
1
Super, suivi votre suggestion, maintenant il est inclus dans .NET 4.7, plus besoin d'installer à partir de NuGet. Merci.
Gengjun Wu
pouvons-nous déjà l'utiliser sur .net. Nous sommes en 2019. Je vise .net 4.7.2
user4951
2

J'ai également rencontré ce problème lors de la mise à niveau de .NET 4.6.2 vers .NET 4.7.2. Malheureusement, je n'ai pas pu supprimer la référence au package System.ValueTuplecar un autre package NuGet que j'utilise en dépend.

Enfin, j'ai pu localiser la cause principale: il y avait une version .NET 4.6.2 de mscorlib.dlltraîner dans le dossier du projet (sortie d'une opération de publication) et MSBuild a décidé de référencer cet assembly au lieu de la référence officielle .NET 4.7.2 ensemble situé dans C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.7.2.

En raison du fait que System.ValueTuple a été introduit dans .NET 4.7, MSBuild a échoué la compilation car il n'a pas pu trouver le type dans l'assembly de référence de .NET 4.6.2.

Oliver Hanappi
la source
1

J'ai également eu cette erreur après la mise à jour vers .NET 4.7.2 et j'ai pu la corriger en réinstallant les packages nuget en utilisant:

Update-Package -Reinstall
Martinoss
la source