Je souhaiterais qu'un délégué soit contraint à renvoyer l'un des deux types; ActionResult ou chaîne. Est-ce possible?Délégué générique contraint en C#
Répondre
Non, ce n'est pas possible (du moins pas dans C# 4 et ci-dessous). Il n'y a pas de support pour les contraintes "ou" sur les paramètres de type générique.
Il n'y a également aucune contrainte qui limite un argument de type à un type exact. Toutes les contraintes limitent les types de base de l'argument type. Ils ne peuvent pas vous empêcher d'hériter d'eux.
Non, ce n'est pas le cas. D'ailleurs, quel serait l'avantage de faire cela? À moins que les deux types aient quelque chose en commun, il n'y a rien que vous puissiez vraiment faire avec le type de retour.
Tenir compte du code qui appelle le délégué:
var returnValue = someDelegate();
De quel type est var
dans ce cas? Le seul ancêtre commun de string
et ActionResult
est object
, c'est tout ce que vous pouvez en tirer. D'un point de vue de typage statique, vous pouvez aussi simplement déclarer le type de retour comme object
.
Est-ce qu'une contrainte à l'un des deux types n'est pas meilleure que l'objet englobant? Je vais essayer d'implémenter ma solution en utilisant l'objet. Appréciez votre réponse! – Ben
Le code appelant ne sait toujours pas quel est le type, il devra donc vérifier explicitement le type avant de pouvoir en faire quoi que ce soit. Cela n'offre pas vraiment de bénéfice par rapport à un délégué non générique, si ce n'est que vous devrez ajouter une condition qui traite des types inattendus. Les génériques sont destinés à maintenir le typage statique sur les classes/délégués/méthodes qui ne traitent pas avec un type particulier. –
Comme Zakalwe, je ne vois pas aussi tout intérêt à le faire, mais ..
Vous pouvez définir deux méthodes surchargées qui acceptent un Func<string>
et un Func<ActionResult>
respectivement. Une méthode privée pourrait prendre Delegate et faire d'autres choses avec.
Comme d'autres réponses ont expliqué, vous ne pouvez pas faire cela, mais vous pouvez contourner le problème en passant différentes continutations pour chaque type de retour:
public delegate void MultiPathDelegate(Action<ActionResult> arAction, Action<string> strAction);
vérification Ainsi, le type de retour se produit dans le délégué au lieu de l'appelant .
- 1. comment utiliser délégué générique anonyme en C# 2.0
- 2. Délégué de paramètre générique?
- 3. Délégué générique ou problème de moulage générique
- 4. Pourquoi ne pouvez-vous pas convertir un type générique ouvert contraint vers le type contraint?
- 5. délégué générique utilisant la réflexion
- 6. compilateur ne parvient pas la conversion d'un type générique contraint
- 7. C# Casting Type générique
- 8. Portée d'un délégué en C#
- 9. Usine générique en C++
- 10. C#: Délégué d'action vs délégué explicite
- 11. Retour d'un délégué anonyme en C# 3.0
- 12. Conversion de délégué C# en Java
- 13. ce qui est délégué exactement en C#
- 14. délégué invoquant des arguments génériques en C#
- 15. délégué Cast à Func en C#
- 16. Création générique d'objets en C#
- 17. Fonction générique factoriel en C#
- 18. déclaration d'istream générique en C++
- 19. Créer méthode générique en C#
- 20. délégué de l'objectif-c
- 21. Put contraint à un EditText
- 22. Evénement C# et délégué
- 23. délégué Objective-C question
- 24. C# délégué dictionnaire ajouter
- 25. C# Délégué de propriété?
- 26. mise en œuvre générique en C
- 27. Utilisation Generics en C# - Appel classe générique d'une classe générique
- 28. objet générique à la liste générique en C#
- 29. Comment déclarer un délégué générique avec un paramètre out
- 30. délégué en tant que classe externe en Objective-C
Fyi: le type 'chaîne' ne peut pas être utilisé comme une contrainte: c'est une classe scellée et les classes scellées sont interdites pour une utilisation dans les arguments de type générique. – Abel
Abel: C'est un cas particulier de mon deuxième point (pas de contrainte "type exact"). Les génériques sont fondamentalement conçus pour rendre votre code plus "général". Restreindre l'argument type à un seul type, par définition, contredit le point d'existence fondamental des génériques. –
Je n'y ai jamais pensé comme ça, mais c'est tout à fait logique. Merci pour l'explication supplémentaire :) – Abel