0
votes

C # Déclarant une variable avec le type d'expression

Je vois qu'il y a de vieilles questions (2011) sur ce sujet, je me demandais simplement si quelque chose a changé d'avoir manqué. Le sujet est une déduction automatique de type, spécifiquement lors de la déclaration de variables. L'objectif ici est de réduire la frappe et donc de réduire les erreurs en évitant la répétition dans le code. Idéalement, une solution devrait avoir une surcharge de temps d'exécution zéro et être facilement comprise par une personne lisant le code.

J'ai une fonction xxx

et je voudrais déclarer une variable xxx

[ajouté] un exemple concret xxx

c'est-à-dire, je veux que le compilateur alimente l'argument de type à la liste Avec le type qui est renvoyé par la fonction sans que j'ai besoin de détecter ou de nommer explicitement ce type. Je cherche un idiome ici, pas comment résoudre un cas d'utilisation spécifique.

Bien sûr, je ne peux pas le faire directement dans C #. Je pense que moderne C ++ me laisserait écrire essentiellement cette déclaration, mais le C # typeof fonctionne uniquement sur des types, pas sur les expressions. Le meilleur que j'ai pu venir proposer (et c'est loin de "bon") est le suivant: xxx

ceci déclare en fait une liste du type correct, même Ramassage avec des noms de pseudo-membres de types de tuple, mais il est uggggggly et très loin d'être clair et a en fait un coût d'exécution, bien que minimal.

a une idiome décente pour cette construction dans le C # 7 / 8 ère?


3 commentaires

S'il vous plaît, partagez l'échantillon reproductible. En outre, comment TUPLE-TYPE-DOCT lié ​​à Type de connexion de la fonction ?


@Pavelanikhouski Les types spécifiques sont sans importance - Insérez tout type de tuple et toute liste de paramètres et tout organisme de fonction que vous souhaitez. L'objectif est de déclarer une variable qui a un type basé sur le type de retour d'une fonction, sans simplement déclarer le type (qui pourrait être complexe ou anonyme).


J'aurais dû dire plus clairement dans le post original - le point de l'exercice consiste à déclarer la variable sans répéter la définition du type (un tuple dans cet exemple) et sans fabriquer une nouvelle classe pour chaque type de tuple divers que je veux retourner des fonctions. Cela permet à la déclaration de variable d'évoluer avec la fonction avec moins d'édition - ajoutez un nouveau membre au tuple, la déclaration de variable est automatiquement correcte. Etc.


4 Réponses :


0
votes

Vous pouvez créer une méthode d'extension pour t xxx

https://dotnetfiddle.net/kkcdzo

Version étendue: https://dotnetfiddle.net/mdunr1


0 commentaires

0
votes

Assumer que votre fonction a été déclarée comme xxx

alors vous pouvez déclarer une liste comme xxx

notez que j'utilise le nouveau < Un href = "https://docs.microsoft.com/en-us/dotnet/cshaarp/Tuples" rel = "NOFOollow NOREFERRER"> valeur de valeur . Il existe depuis C # 7.0 et vous permet de donner des noms aux champs de tuple.

Vous pouvez ensuite accéder à des éléments tels que celui-ci xxx

ou < PRE> XXX

Ceci est également nouveau et s'appelle INTERPOLATION STRING .

et bien sûr, vous pouvez créer votre propre type xxx

maintenant le type a un nom et ses membres avoir un nom. Vous pouvez déclarer une liste sous la forme xxx

Ça fonctionne également avec xxx

si l'expression à droite rétutiliser a Liste , c'est-à-dire si la fonction a un type de retour de muntruct . Notez que la liste dans le second cas est fortement saisie sous forme de liste . Au lieu de la déclarer explicitement, vous laissez simplement laisser le compilateur C # le déduire. Cela se produit comme l'heure de la compilation et n'a aucun impact au moment de l'exécution.


0 commentaires

0
votes

Vous pouvez créer une nouvelle classe qui s'étend de votre tuple code> de choix. Comme exemple, vous pouvez déclarer une classe comme: xxx pré>

alors vous pouvez utiliser cette nouvelle classe mointation code> partout comme n'importe quel autre type. P>

(4, test)
4
test
System.Collections.Generic.List`1[MyThing]


0 commentaires

1
votes

Vous pouvez le faire avec une fonction d'assistance qui accepte une expression > puis renvoie une liste mais vous devez toujours Spécifiez les paramètres "bogus" xxx

et ensuite vous l'utiliseriez comme suit: xxx

Vous pouvez même créer une liste d'un Type anonyme (bien que je ne sois pas sûr de savoir pourquoi vous voudriez): xxx


2 commentaires

Agréable!. Malheureux qu'il soit nécessaire de constituer un ensemble de paramètres factices pour l'expression, mais probablement inévitable.


Cela a également un peu de coût d'exécution. Il est possible que le jiteur dans le runtime optimise l'instanciation de l'expression >, car il est inutilisé. Je n'utiliserais certainement pas cela dans une boucle serrée sans l'enquêter. Comme vous pourriez supposer, mon objectif ici est de l'utiliser en dehors d'une boucle pour accumuler les valeurs renvoyées par une fonction à l'intérieur de cette même boucle.