418 votes

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

J'ai installé Visual Studio 15 Preview 3 et j'ai essayé d'utiliser la nouvelle fonction 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 ou importé.

Según le billet de blog cette fonction doit être activée par défaut.

Qu'est-ce que j'ai fait de mal ?

3 votes

Quelqu'un sait-il si le paquet NuGet est nécessaire même dans la version 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.

0 votes

Vous pouvez essayer d'utiliser System.Tuple<int, int> à la place

0 votes

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

556voto

Eli Arbel Points 5266

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

Install-Package "System.ValueTuple"

Ou en utilisant une référence de paquet 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 votes

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

1 votes

Je suis sûr qu'il sera inclus soit dans la 4.6.2, soit dans la 4.6.3. Je ne sais pas pour le débogueur, mais puisque Roslyn est responsable de l'évaluateur d'expression, je dirais que oui.

0 votes

On dirait que c'est sur leur liste : github.com/dotnet/roslyn/issues/10945 - Interaction avec le débogueur

44voto

Nikita Points 629

Il fait partie de la .NET Framework 4.7 .

Tant que vous ne ciblez pas le cadre ci-dessus ou plus (ou .NET Core 2.0 / .NET Standard 2.0 ), vous devrez faire référence à ValueTuple . Pour ce faire, ajoutez l'élément System.ValueTuple NuGet Package

1 votes

Je viens d'essayer avec .net 4.7 et ça n'a pas marché ? System.ValueTuple`2 non trouvé

0 votes

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 le programme ne compile toujours pas.

12 votes

Ok je viens de trouver le problème : la dll System.ValueTuple était codée en dur dans mon fichier projet (csproj). En supprimant cette entrée du fichier projet, le problème est résolu.

14voto

Julien Couvreur Points 76

Les types ValueTuple sont intégrés dans les cadres plus récents :

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

Tant que vous ne ciblez pas l'une de ces nouvelles versions du framework, vous devez faire référence au paquet ValueTuple.

Plus de détails à l'adresse suivante http://blog.monstuff.com/archives/2017/03/valuetuple-availability.html

5voto

Pour Code Visual Studio utiliser la fonction intégrée Terminal et courir :

dotnet add package "System.ValueTuple"

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

0 votes

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

11 votes

Note : Ne faites pas cela avec .Net 4.7.

3voto

Poulad Points 163

Assurez-vous que vous avez .NET 4.6.2 Developer Pack pour VS installé et ensuite tirer dans System.ValueTuple de NuGet.

2 votes

Même avec .NET 4.6.2, il semble que le paquetage System.ValueTuple soit toujours nécessaire.

3 votes

@mrsundquist, oui tout ce qui est inférieur à 4.7

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X