Le type prédéfini 'System.ValueTuple´2´ n'est pas défini ou importé


385

J'ai installé Visual Studio 15 Preview 3 et essayé d'utiliser la nouvelle fonctionnalité de tuple

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

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

Lorsque je compile, j'obtiens l'erreur:

Le type prédéfini 'System.ValueTuple´2´ n'est pas défini ou importé

Selon l'article de blog , ces fonctionnalités devraient être activées par défaut.

Qu'ai-je fait de mal?


3
Est-ce que quelqu'un sait si le package NuGet est requis même en 2017 RTM ciblant 4.6.2? Il semble que vous en ayez encore besoin et je m'attendais à ce que vous ne le fassiez pas dans la version finale.
dmeglio

vous pouvez essayer d'utiliser System.Tuple <int, int> à la place
Kevin Xiao

Pour moi, ce stackoverflow.com/a/46533630/4383425 était la solution.
Andre

Réponses:


528

Pour .NET 4.6.2 ou inférieur, .NET Core 1.x et .NET Standard 1.x, vous devez installer le package NuGet System.ValueTuple:

Install-Package "System.ValueTuple"

Ou en utilisant une référence de package dans VS 2017:

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

.NET Framework 4.7, .NET Core 2.0 et .NET Standard 2.0 incluent ces types.


3
Merci. Cela signifie-t-il que cela fonctionnerait avec 4.6.2? Le débogueur affiche toujours x.Item1 x.Item2. Au lieu de (xx et xy) Savez-vous si cela va changer?
gsharp

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

14
Eh bien, il ne semble pas y avoir de 4.6.2.
binki

12
Fonctionne avec 4.6.2, a toujours besoin de ce paquet.
Elisabeth

8
Avec .NET 4.7, le package est nativement inclus.
Mafii

40

Cela fait partie du .NET Framework 4.7.

Tant que vous ne ciblez pas le cadre ci-dessus ou supérieur (ou .NET Core 2.0/ .NET Standard 2.0), vous devrez faire référence ValueTuple. Pour ce faire, en ajoutant leSystem.ValueTuple NuGet Package


1
Je viens d'essayer avec .net 4.7 et cela n'a pas fonctionné? System.ValueTuple`2introuvable
Bidou

J'ai installé le .net Framework 4.7 et le pack cible pour Visual Studio. J'ai également sélectionné la version 4.7 dans le menu déroulant, mais elle ne se compile toujours pas.
Bidou

10
Ok, je viens de trouver le problème: la DLL System.ValueTuple a été codée en dur dans mon fichier de projet (csproj). La suppression de cette entrée du fichier de projet a résolu le problème.
Bidou

Bonne solution, mais vous pourriez ajouter plus de détails. Dans mon cas, System.ValueTuple.dll traînait toujours dans mon dossier bin. Une fois que j'ai supprimé cela, j'étais prêt à partir. Ma version linguistique est à defaultet tout fonctionne.
toddmo


5

Pour Visual Studio Code, utilisez le terminal intégré et exécutez:

dotnet add package "System.ValueTuple"

N'oubliez pas de courir dotnet restoreaprès.


Je n'ai pas réussi à faire fonctionner cela dans VS Code.
JonathanPeel

10
Remarque: ne faites pas cela avec .Net 4.7
toddmo


3

Dans le cas où d'autres ont le même problème, j'ai rencontré cette erreur après avoir mis à jour un projet en 4.7. Curieusement, j'ai dû supprimer la référence System.ValueTuple pour que cette erreur disparaisse.


3

Je ne conseillerais pas d'ajouter ValueTuplecomme référence de package aux projets .net Framework. Comme vous le savez, cet assemblage est disponible à partir de 4.7 .NET Framework.

Il peut y avoir certaines situations où votre projet essaiera d'inclure à tout prix ValueTuple partir du dossier .NET Framework au lieu du dossier du package et cela peut entraîner des erreurs d'assembly non trouvées.

Nous avons eu ce problème aujourd'hui en compagnie. Nous avions une solution avec 2 projets (je simplifie trop):

  • Lib
  • Web

Libincluait ValueTuple et Webutilisait Lib. Il s'est avéré que, pour une raison inconnue, Weblors de la tentative de résolution du chemin vers, il ValueTuplefallait avoir HintPathdans le répertoire .NET Framework et prendre une version incorrecte. Notre application se bloquait à cause de cela. ValueTuplen'a pas été défini dans .csprojde Webni HintPathpour cette assemblée. Le problème était très bizarre. Normalement, il copiera l'assembly à partir du dossier du package. Cette fois n'était pas normale.

Pour moi, il est toujours risqué d'ajouter des System.*références de package. Ils sont souvent comme des bombes à retardement. Ils vont bien au début et ils peuvent exploser dans votre visage au pire moment. Ma règle d' System.*or : n'utilisez pas le package Nuget pour .NET Framework s'il n'y en a pas vraiment besoin.

Nous avons résolu notre problème en ajoutant manuellement ValueTupledans le .csprojfichier à l'intérieur du Webprojet.


1

Je suis également tombé sur 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 du package System.ValueTuplecar un autre package NuGet que j'utilise en dépend.

Enfin, j'ai pu localiser la cause première: 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 assemblage situé dansC:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.7.2 .

Étant donné 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.

(doublon de https://stackoverflow.com/a/57777123/128709 )


0

J'ai dû vérifier que le fichier System.ValueTuple.dll était sous contrôle de source et corriger sa référence dans les fichiers .cssproj:

  1. clic droit sur chaque projet en solution
  2. décharger le projet
  3. modifier le fichier .cssproj: modifier

<Reference Include = "System.ValueTuple">

<HintPath>

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

</ HintPath>

</ Référence>

dans

<Reference Include = "System.ValueTuple">

<HintPath>

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

</ HintPath>

</ Référence>

  1. enregistrer les modifications et recharger les projets
  2. recherchez System.ValueTuple.dll et enregistrez-le dans ce dossier
  3. ajouter une référence de ce fichier dans le contrôle de code source

(Facultatif): 7. résoudre les mêmes problèmes avec un autre fichier .dll de cette façon


1
Coder en dur un chemin de fichier fixe (ou n'importe quelle chaîne) n'est jamais une bonne solution.
Arghya C

0

Nous voyions ce même problème dans l'un de nos anciens projets qui ciblait le Framework 4.5.2. J'ai essayé plusieurs scénarios, y compris tous ceux répertoriés ci-dessus: cible 4.6.1, ajouter le package System.ValueTuple, supprimer les dossiers bin, obj et .vs. Pas de dé. Répétez le même processus pour 4.7.2. Ensuite, j'ai essayé de supprimer le package System.ValueTuple car je visais 4.7.2 comme l'a suggéré un commentateur. Toujours rien. Chemin de référence du fichier csproj vérifié. Ça a l'air bien. Même redescendu à 4.5.2 et réinstallant le package. Tout cela avec plusieurs redémarrages VS et en supprimant plusieurs fois les mêmes dossiers. Littéralement, rien n'a fonctionné.

J'ai dû refactoriser pour utiliser une structure à la place. J'espère que d'autres ne continueront pas à rencontrer ce problème à l'avenir, mais j'ai pensé que cela pourrait être utile si vous vous retrouvez aussi perplexe que nous.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.