2017-05-21 1 views
2

ValueTuple en tant que nouvelle fonctionnalité dans C# 7.0 est la méthode publique Create qui aide à créer ValueTuples (à partir de singleton to octuple ou plus) d'autre part, nous pouvons également utiliser new pour atteindre les mêmes résultats. J'ai remarqué que ces comportements se comportaient différemment. Je suis en train de recherche est inférieure à la mise en œuvre incorrecte ou c'est quelque chose que par la conception:ValueTuple: quel est le problème avec la création d'octuple?

Méthode CreateOctuple() fonctionne comme prévu:

private static ValueTuple<int, int, int, int, int, int, int, ValueTuple<int>> CreateOctuple() 
{ 
    return new ValueTuple<int, int, int, int, int, int, int, ValueTuple<int>>(1, 2, 3, 4, 5, 6, 7, new ValueTuple<int>(8)); ; 
} 

Maintenant, j'ai essayé d'obtenir même méthode sortie en utilisant Create(), malheureusement, il se plaint du type de retour:

private static ValueTuple<int, int, int, int, int, int, int, ValueTuple<int>> OctupleUsingCreate() 
{ 
    return ValueTuple.Create(1, 2, 3, 4, 5, 6, 7, ValueTuple.Create(8)); 
} 

Quel est le problème ici? enter image description here

P.S. Tous les paquets sont à jour et j'utilise Visual Studio 2017 - dernière version. enter image description here

Comme suggéré par Svick

static ValueTuple<int, int, int, int, int, int, int, ValueTuple<int>> OctupleUsingCreate() 
{ 
    return ValueTuple.Create(1, 2, 3, 4, 5, 6, 7, 8); 
} 

Cette invites exception du même compilateur: enter image description here

Répondre

5

Le problème est que ValueTuple.Create prend déjà soin d'appeler ValueTuple.Create sur le 8ème élément. Donc, alors que le type correct pour 8-tuple est ValueTuple<int, int, int, int, int, int, int, ValueTuple<int>>, vous créez ValueTuple<int, int, int, int, int, int, int, ValueTuple<ValueTuple<int>>>. Le correctif est juste pour supprimer le deuxième appel à ValueTuple.Create:

static ValueTuple<int, int, int, int, int, int, int, ValueTuple<int>> OctupleUsingCreate() 
{ 
    return ValueTuple.Create(1, 2, 3, 4, 5, 6, 7, 8); 
} 

Ou vous pouvez simplement utiliser la syntaxe tuple, mais je suppose que vous avez une raison pour l'éviter:

static (int, int, int, int, int, int, int, int) OctupleUsingCreate() 
{ 
    return (1, 2, 3, 4, 5, 6, 7, 8); 
} 
+0

J'ai déjà essayé ça. Mais ça ne fonctionnait pas. J'ai mis à jour la question avec snapshot et le code comme sugegsted. –

+0

@GauravAroraa C'est juste un bug ReSharper. Le code compile et fonctionne bien. – svick

+2

@GauravAroraa Je viens de [rapporté] (https://youtrack.jetbrains.com/issue/RSRP-464845). – svick

0

Vous devez mettre à jour ce paquet: Microsoft.Net.Compilers à 2.0 (vous devez montrer pré-version). Il serait corriger l'erreur, vérifier cela here

+0

Merci pour une réponse rapide. Tous les paquets Nuget sont à jour J'ai mis à jour la question avec capture d'écran. –

0

Note: Ce n'est pas un problème avec la bibliothèque ValueTuple ou le compilateur C#. Pas d'erreur sur TryRoslyn avec:

using System; 
public class C 
{ 
    private static ValueTuple<int, int, int, int, int, int, int, ValueTuple<int>> OctupleUsingCreate() 
    { 
     return ValueTuple.Create(1, 2, 3, 4, 5, 6, 7, 8); 
    } 
}