De MSDN :
En éliminant les casts inutiles, les conversions implicites peuvent améliorer la lisibilité du code source. Cependant, comme les conversions implicites peuvent se produire sans que le programmeur ne les spécifie, il faut veiller à éviter les mauvaises surprises. En général, les opérateurs de conversion implicites ne doivent jamais lever d'exceptions et ne doivent jamais perdre d'informations, de sorte qu'ils puissent être utilisés en toute sécurité sans que le programmeur en ait conscience. Si un opérateur de conversion ne peut pas répondre à ces critères, il doit être marqué explicite.
Bien que je ne sois pas en désaccord avec un point particulier, et que je sois d'accord pour dire que tout cela est très bien, y a-t-il jamais une raison suffisamment importante pour justifier la rupture de la partie concernant les conversions implicites qui ne lèvent pas d'exceptions ?
Le cas particulier que j'ai devant moi est un cas où :
- J'ai une fonction, qui renvoie un objet de collection personnalisé (nous l'appellerons
FooCollection
). - Cette fonction peut retourner des collections avec un seul élément, et on peut déterminer à partir du code source si cela se produira ou non . (j'entends par là l'appel de la fonction, pas la fonction elle-même).
- Si cela se produit, il y a 99,9 % de chances que l'utilisateur veuille cet élément unique, plutôt qu'une collection contenant un seul élément.
Maintenant, je me demande s'il faut inclure une conversion implicite de l'anglais au français. FooCollection
=> Foo
pour masquer ce petit détail d'implémentation, mais cette conversion ne fonctionnera que s'il n'y a qu'un seul élément dans la collection.
Est-il possible de lancer un Exception
dans ce cas ? Ou devrais-je plutôt utiliser un cast explicite ? Avez-vous d'autres idées sur la façon dont je pourrais traiter ce problème (non, en raison de détails de mise en œuvre, je ne peux pas simplement utiliser deux fonctions) ?
EDITAR: Je pense qu'il convient de noter que FooCollection
n'implémente aucune interface ou n'étend pas réellement Collection
comme son nom l'indique, les réponses basées sur LINQ sont donc inutiles. De plus, bien que la collection implémente un index numérique, ce n'est pas la manière la plus intuitive de traiter la collection car elle repose principalement sur l'index nommé.