2010-07-15 8 views
3

Inspiré par Phil Haack's attempt on null or empty coalescing, j'essaye d'écrire quelques méthodes d'extension pour l'objet string, ainsi que sur l'interface IEnumerable<T>, pour simplifier la vérification de null ou d'emtpy. Cependant, je rencontre des problèmes: lorsque j'essaie d'appeler la version string de AsNullIsEmpty, le compilateur traite ma chaîne comme IEnumerable<char> et, bien sûr, donne le mauvais type de retour.Anti-contrainte sur les génériques C#

Est-il possible de mettre un « anti-contrainte » sur la définition de la version IEnumerable, afin que je puisse dire au compilateur d'utiliser celui-ci à chaque fois que le type de T est passtring? Quelque chose comme

public static IEnumerable<T> AsNullIfEmpty(this IEnumerable<T> items) 
    where T !: string 

Je sais que je pouvais changer le nom d'un d'entre eux, mais je veux avoir le même nom pour la cohérence.

Mise à jour: Il se trouve mon problème avec les méthodes d'extension a été résolu d'une autre manière, par la fixation d'une erreur simple et stupide (j'utilisais str.IsNullOrEmpty(), la méthode d'extension sur IEnumerable<T>, au lieu de string.IsNullOrEmpty(str) ...) mais depuis la question des anti-contraintes sur les génériques est encore intéressante, je ne vais pas l'effacer.

+0

Le compilateur utilisera la méthode disponible la plus spécifique. Si vous implémentez une chaîne et assurez-vous qu'elle est disponible sur le site d'appel, vous n'aurez pas de problème comme celui décrit –

Répondre

8

La seule façon de procéder serait de créer une surcharge de cette extension qui accepte un string comme paramètre this. Cela fera que la version spécifiquement typée sera considérée comme une meilleure correspondance de surcharge que la version générique. En ce qui concerne votre question spécifique ("Puis-je spécifier une 'anti-contrainte' sur un paramètre de type générique?"), La réponse est non. Vous pourriez cependant vous rapprocher de l'attribut Obsolete.

[Obsolete("AsNullIfEmpty is not supported for strings.", true)] 
public static string AsNullIfEmpty(this string value) 

Cela entraînerait le compilateur à signaler une erreur pour cette surcharge.

+0

C'est ce que j'avais - et comme vous le voyez dans ma mise à jour, le problème de méthode d'extension est résolu. (Le problème existait à cause d'une autre erreur ...). Cependant, est-il possible de spécifier des anti-contraintes? –

+0

Alors quand T est une chaîne, vous obtenez une bonne intelense de 2 méthodes avec des signatures identiques. –

+0

@Tomas: Il y a une réponse simple à celle-là: Non, il n'y a aucun moyen de spécifier des anti-contraintes. – LukeH