C # 7: Comment puis-je déconstruire un object en une seule valeur à l’aide d’un tuple?

L’une des nouvelles fonctionnalités intéressantes de C # 7 est la possibilité de définir des déconstructeurs pour les classes et d’affecter les valeurs déconstruites directement à un tuple de valeurs.

Cependant, dans le cas où l’object est déconstruit en une seule valeur, je ne trouve pas le moyen de l’affecter à un tuple. Bien qu’il existe un type pour les n-uplets avec un seul élément ( ValueTuple ), la syntaxe abrégée utilisant des parenthèses ne fonctionne pas ici. La seule façon pour moi d’accéder au déconstructeur était d’appeler directement la méthode Deconstruct , mais cela élimine ses avantages, car je pouvais utiliser n’importe quelle méthode à cette fin.

Est-ce que quelqu’un connaît un meilleur moyen de déconstruire un object en une seule valeur?

Voici mon code de test:

 class TestClass { private ssortingng s; private int n; public TestClass(ssortingng s, int n) => (this.s, this.n) = (s, n); public void Deconstruct(out ssortingng s) => s = this.s; public void Deconstruct(out ssortingng s, out int n) => (s, n) = (this.s, this.n); } static void Main(ssortingng[] args) { var testObject = new TestClass("abc", 3); var (s1) = testObject; // sytax error (comma expected) ValueTuple t = testObject; // error: "no implicit conversion from TestClass to (ssortingng)" testObject.Deconstruct(out ssortingng s2); // this works var (s3, n) = testObject; // no problem Console.WriteLine($"{s1} {t.Item1} {s2} {s3} {n}"); Console.ReadKey(); } 

Bien qu’il existe un type pour les n-uplets avec un seul élément ( ValueTuple ), la syntaxe abrégée utilisant des parenthèses ne fonctionne pas ici.

C’est correct. La syntaxe des tuples ne fonctionne que pour les tuples de 2 valeurs ou plus, la méthode Deconstruct avec un seul paramètre out n’est donc pas très utile. (Il existe même un type ValueTuple pour 0 élément)

La solution la plus courte consiste à ignorer le deuxième paramètre:

 var (s1, _) = testObject; 

Edit: basé sur les commentaires, une petite clarification.
À partir de C # 7, _ n’est plus une variable dans cette situation. C’est une nouvelle fonctionnalité appelée «rejeter».
Même si vous avez plusieurs parameters de sortie (et même s’ils sont de types différents), vous pouvez les ignorer avec un trait de soulignement:

 var (s1, _, _, _) = testObject; 

Les décompositions en un seul élément ne sont pas sockets en charge dans C # 7.0.

La raison pour laquelle vous auriez besoin d’un tel mécanisme n’est pas claire, car vous pouvez simplement accéder à une propriété ou écrire un opérateur de conversion pour obtenir le même résultat.

Conceptuellement, un tuple d’un élément n’est que cet élément (vous n’avez pas besoin d’un tuple pour le contenir). Donc, il n’existe pas de syntaxe de tuple (utilisant la notation entre parenthèses) pour faciliter cela (pour ne pas dire, elle serait syntaxiquement ambiguë). Il en va de même pour les déconstructions.

Voici les notes LDM les plus pertinentes que j’ai pu trouver: 2017-03-15 (zéro et un élément et déconstructions).

Il est possible qu’une telle déconstruction devienne autorisée dans certains scénarios de modèle récursif futurs, mais cela n’a pas encore été finalisé.