2010-07-29 8 views
5

J'ai remarqué quelque chose d'étrange à propos de l'utilisation de l'opérateur XOR bit à bit sur byte s en C#. Bizarre à mon avis, au moins.Opérateurs XOR C#:^vs^= et conversion de type implicite

byte a = 0x11; 
byte b = 0xAA; 
a ^= b;   // works 
a = a^b;  // compiler error: Cannot implicitly convert type "int" to "byte" 

Je vois aussi cette question en utilisant short, mais pas int ou long. Je pensais que les deux dernières lignes étaient équivalentes, mais cela ne semble pas être le cas. Que se passe t-il ici?

+0

Je suis d'accord, il semble étrange. @ matthew-flaschen l'a cloué, cependant. – kbrimington

Répondre

9

Il n'y a pas d'opérateur xor qui accepte et retourne des octets. Donc C# élargit implicitement les octets d'entrée à ints. Cependant, il pas réduit implicitement le résultat int. Ainsi, vous obtenez l'erreur donnée sur la deuxième ligne. Cependant, §14.14.2 (affectation de composé) de the standard prévoit que:

si le retour type de l'opérateur sélectionné est explicitement convertible du type de x, et si y est implicitement convertible à la type de x ou l'opérateur est un opérateur de décalage , l'opération est évalué comme x = (T) (x op y), où T est le type de x, sauf que x est évalué une seule fois.

x et y (les entrées) sont tous les deux des octets. Vous pouvez explicitement restreindre un int à un octet, et clairement un octet est implicitement convertible en un octet. Ainsi, il y a une distribution implicite.

1

Dans la plupart des langages de type C, les opérateurs vont promouvoir des types plus petits que int à int.

Dans ces langues, a op= b est équivalent à a = (typeof a)(a op b)

Questions connexes