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 p> et je voudrais déclarer une variable p> [ajouté] un exemple concret p> 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. P> 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 # 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. p> a une idiome décente pour cette construction dans le C # 7 / 8 ère? P> P> typeof code> 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: p>
4 Réponses :
Vous pouvez créer une méthode d'extension pour https://dotnetfiddle.net/kkcdzo p> Version étendue:
https://dotnetfiddle.net/mdunr1 p> p> t code>
Assumer que votre fonction a été déclarée comme alors vous pouvez déclarer une liste comme p> 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. P> Vous pouvez ensuite accéder à des éléments tels que celui-ci p> ou p> < PRE> XXX PRE> Ceci est également nouveau et s'appelle INTERPOLATION STRING . P> et bien sûr, vous pouvez créer votre propre type P> maintenant le type a un nom et ses membres avoir un nom. Vous pouvez déclarer une liste sous la forme p> Ça fonctionne également avec p> si l'expression à droite rétutiliser a Liste
muntruct code>. Notez que la liste dans le second cas est fortement saisie sous forme de liste
Vous pouvez créer une nouvelle classe qui s'étend de votre alors vous pouvez utiliser cette nouvelle classe tuple code> de choix. Comme exemple, vous pouvez déclarer une classe comme:
mointation code> partout comme n'importe quel autre type. P>
(4, test)
4
test
System.Collections.Generic.List`1[MyThing]
Vous pouvez le faire avec une fonction d'assistance qui accepte une expression et ensuite vous l'utiliseriez comme suit: p> 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): p> Func
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
S'il vous plaît, partagez l'échantillon reproductible. En outre, comment
TUPLE-TYPE-DOCT code> lié à
Type de connexion de la fonction code>?
@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.