web-dev-qa-db-fra.com

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

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

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

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

Quand je compile, j'obtiens l'erreur:

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

Selon la publication sur le blog , cette fonctionnalité devrait être activée par défaut. 

Qu'ai-je fait de mal?

313
gsharp

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.

439
Eli Arbel

Cela fait partie du .NET Framework 4.7 .

Tant que vous ne ciblez pas le framework ci-dessus ou supérieur (ou .NET Core 2.0/.NET Standard 2.0), vous devrez référencer ValueTuple. Faites ceci en ajoutant le System.ValueTupleNuGet Package

35
Nikita

Les types ValueTuple sont intégrés aux nouveaux frameworks:

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

Jusqu'à ce que vous cibliez l'une de ces versions d'infrastructure plus récentes, vous devez référencer le package ValueTuple.

Plus de détails sur http://blog.monstuff.com/archives/2017/03/valuetuple-availability.html

13
Julien Couvreur

Pour Visual Studio Code, utilisez Terminal et exécutez:

dotnet add package "System.ValueTuple"

N'oubliez pas de lancer dotnet restore après.

5
Sebastian Krogull

Assurez-vous que .NET 4.6.2 Developer Pack for VS est installé, puis extrayez le paquet System.ValueTuple de NuGet.

3
Poulad

Au cas où d’autres auraient 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
Javier Rosa

Je ne conseillerais pas d'ajouter ValueTuple en tant que référence de package aux projets .net Framework. Comme vous le savez, cette assemblée est disponible à partir de 4.7 .NET Framework.

Il peut arriver que votre projet tente d'inclure à tout prix ValueTuple à partir d'un dossier .NET Framework au lieu d'un dossier de package, ce qui peut entraîner des erreurs d'assemblage non trouvé.

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

  • Lib
  • Web

Lib incluait ValueTuple et Web utilisait Lib. Il s'est avéré que pour une raison inconnue, Web lors de la tentative de résolution du chemin d'accès à ValueTuple recevait HintPath dans le répertoire .NET Framework et prenait une version incorrecte. Notre application se bloquait à cause de cela. ValueTuple n'était pas défini dans .csproj de Web ni HintPath pour cet assemblage. Le problème était très bizarre. Normalement, il copierait l'assembly du dossier du paquet. Cette fois n'était pas normal.

Pour moi, il est toujours risqué d’ajouter System.* références de paquets. Ils sont souvent comme une bombe à retardement. Ils vont bien au début et peuvent exploser au visage dans les pires moments. Ma règle empirique: n'utilisez pas System.* paquet Nuget pour . NET Framework s'il n'en est pas vraiment besoin.

Nous avons résolu notre problème en ajoutant manuellement ValueTuple dans le fichier .csproj du projet Web.

1
Shoter

Nous avons constaté le même problème dans l'un de nos anciens projets, qui visait Framework 4.5.2. J'ai essayé plusieurs scénarios, dont tous ceux énumérés ci-dessus: cible 4.6.1, ajout du paquet System.ValueTuple, suppression des dossiers bin, obj et .vs. Pas de dé. Répétez le même processus pour 4.7.2. Puis essayé de supprimer le paquet System.ValueTuple puisque je visais 4.7.2 comme l’a suggéré un intervenant. 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éinstaller le paquet. Tout cela avec plusieurs VS redémarre et supprime 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 à se heurter à ce problème à l'avenir, mais j'ai pensé que cela pourrait être utile si vous restiez aussi confus que nous.

0
Candace Wrather

Je devais 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. éditer le fichier .cssproj: changer

<Reference Include = "System.ValueTuple">

<HintPath>

....\NomProjet\NomProjet\obj\Publication\Package\PackageTmp\bin\System.ValueTuple.dll 

</ HintPath>

</ Reference>

dans 

<Reference Include = "System.ValueTuple">

<HintPath> 

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

</ HintPath>

</ Reference>

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

(Facultatif): 7. résolvez les mêmes problèmes avec d'autres fichiers .dll de cette façon

0
Alexander Blumenau