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