Le compilateur C# nécessite que chaque fois qu'un type personnalisé définit l'opérateur ==
, il doit également définir !=
(voir ici).
Pourquoi?
Je suis curieux de savoir pourquoi les concepteurs ont pensé qu'il était nécessaire et pourquoi pas le compilateur par défaut pour une mise en œuvre raisonnable pour les opérateurs lors que l'autre est présent. Par exemple, Lua permet de définir uniquement l'opérateur d'égalité et vous obtenez le autres gratuitement. C# pourrait faire de même en vous demandant de définir == ou les deux == et != et puis compiler automatiquement le manque != opérateur de !(left == right)
.
Je comprends qu'il y a de bizarre coin des cas où certaines entités ne peut être égale ou inégale (comme de la norme IEEE-754 NaN), mais celles-ci semblent comme l'exception, pas la règle. Donc, cela n'explique pas pourquoi le compilateur C# concepteurs fait de l'exception la règle.
J'ai vu des cas de mauvaise qualité de l'exécution, où l'opérateur d'égalité est définie, alors l'opérateur d'inégalité est un copier-coller à chaque comparaison inversé et tout && passé à l' || (vous obtenez le point... en fait !(a==b) étendu par le biais De Morgan règles). C'est une mauvaise pratique que le compilateur pourrait éliminer par la conception, comme c'est le cas avec Lua.
Note: La même chose vaut pour les opérateurs < > <= >=. Je ne peux pas imaginer des cas où vous aurez besoin de les définir de façon anormale. Lua permet de définir uniquement les < et <= et définit >= et > naturellement, à travers les faiseurs de " déni. Pourquoi ne pas en C# en faire de même (au moins "par défaut")?
MODIFIER
Apparemment il y a des raisons valables de permettre au programmeur de mettre en œuvre des contrôles de l'égalité et de l'inégalité mais ils aiment. Certaines des réponses point pour les cas où c'est peut-être belle.
Le noyau de ma question, cependant, ce est pourquoi ce est la force nécessaire en C# quand habituellement, il n'est pas logiquement nécessaire?
Il est également en contraste frappant avec les choix de conception .NET les interfaces Object.Equals
, IEquatable.Equals
IEqualityComparer.Equals
où le manque de NotEquals
homologue montre que le cadre considère !Equals()
des objets que l'inégalité et c'est tout. En outre, des classes comme l' Dictionary
et des méthodes comme .Contains()
dépendent exclusivement sur lesdites interfaces et de ne pas utiliser les opérateurs directement, même si elles sont définies. En fait, quand ReSharper génère de l'égalité des membres, il définit à la fois ==
et !=
en termes de Equals()
, et même alors, seulement si l'utilisateur choisit de générer des opérateurs à tous. Les opérateurs d'égalité ne sont pas requises par le cadre pour comprendre l'objet de l'égalité.
Fondamentalement, l' .NET framework ne se soucie pas de ces opérateurs, il se soucie uniquement de quelques Equals
méthodes. La décision d'exiger à la fois == et != les opérateurs à être défini en tandem par l'utilisateur est lié uniquement à la conception de langage et non à l'objet de la sémantique dans la mesure où .NET est concerné.