34 votes

Erreur de compilation ValueTuple C # 7

Je suis en utilisant VS2017 RC et ma demande cibles net framework 4.6.1.

J'ai deux assemblées du Système de référence.ValueTuple 4.3

MyProject.Services MyProject.WebApi

Dans MyProject.Services que j'ai une classe avec une méthode comme ceci

public async Task<(int fCount, int cCount, int aCount)> GetAllStatsAsync()
{
    // Some code...
    return (fCount, cCount, aCount);
}

Dans MyProject.WebApi j'ai un contrôleur qui utilisent cette méthode comme ça:

public async Task<HttpResponseMessage> GetInfoAsync()
{
    // Some code...
    var stats = await _myClass.GetAllStatsAsync();

    var vm = new ViewModel
             {
                 FCount = stats.fCount,
                 CCount = stats.cCount,
                 ACount = stats.aCount
             };

     return Request.CreateResponse(HttpStatusCode.OK, vm);
}

Intellisense est de travailler et de déconstruire le tuple mais quand je compile il échoue sans Erreur dans la fenêtre Liste des Erreurs. Dans la sortie de windows j'ai cette erreur:

2>MyController.cs(83,31,83,40): erreur CS1061: 'ValueTuple' ne contient pas une définition pour 'fCount" et pas d'extension la méthode 'fCount' acceptant un premier argument de type 'ValueTuple' a pu être trouvé (vous manque une directive using ou une assemblée de référence?) 2>MyController.cs(84,39,84,49): erreur CS1061: 'ValueTuple' ne contient pas une définition pour 'cCount' et aucune méthode d'extension 'cCount' acceptant un premier argument de type 'ValueTuple' a pu être trouvée (êtes-vous en manque un à l'aide la directive ou une référence d'assembly?) 2>MyController.cs(85,35,85,40): erreur CS1061: 'ValueTuple' ne contient pas de définition pour 'compte' et aucune méthode d'extension 'account' accepter un premier argument de type 'ValueTuple' a pu être trouvée (sont vous manque une directive using ou une référence d'assembly?)

J'ai essayé d'ajouter la DÉMO et DEMO_EXPERIMENTAL construire des drapeaux, mais ne fonctionne toujours pas.

Une idée sur ce qu'est le mal?

EDIT 1:

Ce code fonctionne et stats est bien décomposé. Je suis probablement frapper un bug.

public async Task<HttpResponseMessage> GetInfoAsync()
{
    // Some code...
    var stats = await _myClass.GetAllStatsAsync();
    var tu = stats.ToTuple();
    var vm = new ViewModel
             {
                 FCount = tu.Item1,
                 CCount = tu.Item2,
                 ACount = tu.Item3
             };

     return Request.CreateResponse(HttpStatusCode.OK, vm);
}

EDIT 2:

Question ouverte sur github ici: https://github.com/dotnet/roslyn/issues/16200

47voto

Swell Points 1223

Si quelqu'un tombe dans le même piège, pour résoudre ce problème, vous devez mettre à jour ce package: Microsoft.Net.Compilers à 2.0 (vous devez afficher la version préliminaire)

0voto

Facundo La Rocca Points 2274

Je pense que c'est parce que vous n'avez pas défini fCount, cCount et aCount. Essaye ça

 public async Task<(int fCount, int cCount, int aCount)> GetAllStatsAsync()
{
    // Some code...
    //fCount, cCount, aCount are not defined here, so you should define them

    var fCount = 0;
    var cCount= 0;
    var aCount = 0;
    return (fCount , cCount, aCount );

    //Other ways:
    //return (fCount : 0, cCount: 0, aCount : 0);
    //return new (int fCount , int cCount, int aCount ) { fCount = 0, cCount = 0, aCount = 0 };
}

public async Task<HttpResponseMessage> GetInfoAsync()
{
    // Some code...
    var stats = await _myClass.GetAllStatsAsync();

    var vm = new ViewModel
             {
                 FCount = stats.fCount,
                 CCount = stats.cCount,
                 ACount = stats.aCount
             };

     return Request.CreateResponse(HttpStatusCode.OK, vm);
}
 

Modifié avec la suggestion @Swell

Jetez un oeil à ce post

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