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?
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.
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.ValueTuple
NuGet Package
Les types ValueTuple sont intégrés aux nouveaux frameworks:
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
Pour Visual Studio Code, utilisez Terminal et exécutez:
dotnet add package "System.ValueTuple"
N'oubliez pas de lancer dotnet restore
après.
Assurez-vous que .NET 4.6.2 Developer Pack for VS est installé, puis extrayez le paquet System.ValueTuple
de NuGet.
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.
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
.
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.
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:
<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>
(Facultatif): 7. résolvez les mêmes problèmes avec d'autres fichiers .dll de cette façon