web-dev-qa-db-fra.com

Erreur de compilation C # 7 ValueTuple

J'utilise VS2017 RC et mon application cible net framework 4.6.1.

J'ai deux assemblages référençant System.ValueTuple 4.3

MyProject.Services MyProject.WebApi

Dans MyProject.Services, j'ai une classe avec une méthode comme celle-ci.

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 utilise 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 fonctionne et déconstruit le tuple, mais lors de la compilation, il échoue sans erreur dans la fenêtre Error List Error . Dans les fenêtres de sortie, j'ai les erreurs suivantes:

2> MyController.cs (83,31,83,40): erreur CS1061: "ValueTuple" ne contient pas de définition pour "fCount" et aucune extension la méthode 'fCount' acceptant un premier argument de type 'ValueTuple' a pu être trouvée (il manque une directive using ou une Référence d'assembly?) 'ValueTuple' ne contient pas de définition pour 'cCount' et pas de méthode d'extension 'cCount' acceptant un premier argument de type 'ValueTuple' a pu être trouvé (il vous manque une directive Ou une référence Assembly?) 2> MyController.cs (85,35,85,40): erreur CS1061: 'ValueTuple' ne contient pas de définition pour 'aCount' et aucune méthode d'extension 'aCount' acceptant un le premier argument de type 'ValueTuple' a pu être trouvé (manque-t-il une directive using ou une référence Assembly?)

J'ai essayé d'ajouter les indicateurs de construction et DEMO_EXPERIMENTAL, mais j'échoue toujours.

Une idée sur ce qui ne va pas?

EDIT 1:

Ce code fonctionne et les statistiques sont bien déconstruites. Je suis probablement en train de 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:

Numéro ouvert sur github ici: https://github.com/dotnet/roslyn/issues/16200

28
Swell

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

40
Swell

Je pense que c'est parce que vous n'avez pas défini fCount, acCount et aCcount. 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);
}

Edité avec la suggestion @Swell

Jetez un oeil à cet article

0
Facundo La Rocca