2010-01-14 5 views

Répondre

6

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.

+1

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

+1

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. –

+0

Je n'y ai jamais pensé comme ça, mais c'est tout à fait logique. Merci pour l'explication supplémentaire :) – Abel

2

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.

+0

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

+2

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. –

0

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.

2

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 .