2010-09-24 8 views
1

Je me demandais simplement où les règles pour les opérateurs en C# sont réellement définies.Où sont définis les opérateurs (en C#)?

E.g. Où puis-je voir le code qui dit que == vérifie les références de deux objets?

Je peux voir les surcharges de l'opérateur, par ex. la classe String mais maintenant je suis intéressé à voir le cas 'base'. Est-ce juste quelque chose que le compilateur sait explicitement faire avec et donc il n'y a pas de code que nous pouvons voir en utilisant des outils tels que Reflector.

+0

Je ne serais pas trop surpris si la plupart des opérateurs ne pouvaient pas être définis dans la langue elle-même (dans la plupart des langues, en fait). – delnan

+0

@delnan: bien sûr, soit avec NOT AND (NAND) ou seulement avec NOT OR (NOR) vous pouvez définir n'importe quel autre opérateur, donc vous pouvez construire une langue avec un seul de ces opérateurs prédéfini en dehors de la langue. En fait, c'est ainsi que fonctionnent les micropuces. –

+0

C'est pourquoi j'ai dit * plus *. Les opérateurs logiques peuvent être réduits à NAND ou NOR. Mais comment est par exemple '+' défini? – delnan

Répondre

9

Vous ne pouvez pas le voir dans le code (sauf peut-être dans le SSCLI, je n'ai pas vérifié). Vous aurez besoin de regarder le C# language specification. Par exemple:

7.10.6 opérateurs d'égalité de type référence

Le égalité type de référence prédéfini opérateurs sont:

bool operator ==(object x, object y); 
bool operator !=(object x, object y); 

Les opérateurs renvoient le résultat de comparant les deux références pour égalité ou non-égalité.

Étant donné que les opérateurs d'égalité de type référence prédéfinis acceptent opérandes de de type object, ils appliquent à tous les types qui ne déclarent pas l'opérateur applicable == et exploitant != membres. Inversement, tous les opérateurs d'égalité applicables définis par l'utilisateur masquent les opérateurs d'égalité de type de référence prédéfinis.

6

L'opérateur == compile jusqu'à un appel à la ceqIL instruction.

+0

Pour la plupart, mais pas pour tous. Par exemple. 'string', par exemple 'System.Type' – colinfang

Questions connexes