2010-07-29 14 views
5

He notado algo extraño sobre el uso del operador XOR bit a bit en byte s en C#. Extraño para mi mente, al menos.Operadores C# XOR:^vs^= y conversión de tipo implícita

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

También veo este problema utilizando short, pero no int o long.

Pensé que las dos últimas líneas eran equivalentes, pero ese no parece ser el caso. ¿Que está pasando aqui?

+0

estoy de acuerdo que es extraño. @ matthew-flaschen lo clavó, sin embargo. – kbrimington

Respuesta

9

No hay operador xor que toma y devuelve bytes. Entonces C# amplía implícitamente los bytes de entrada a las entradas. Sin embargo, hace no reduce implícitamente el resultado int. Por lo tanto, obtienes el error dado en la segunda línea. Sin embargo, §14.14.2 (asignación de compuesto) de the standard establece que:

si el tipo de retorno del operador seleccionado es explícitamente convertible al tipo de x, y si Y es implícitamente convertible a la tipo de x o el operador es un operador de desplazamiento , luego la operación es evaluada como x = (T) (x op y), donde T es el tipo de x, excepto que x es evaluado solo una vez.

xey (las entradas) son ambos bytes. Puede limitar explícitamente un int a un byte, y claramente un byte es implícitamente convertible en un byte. Por lo tanto, hay un elenco implícito.

1

En la mayoría de los lenguajes tipo C, los operadores promoverán tipos más pequeños que int a int.

En estos idiomas, a op= b es equivalente a a = (typeof a)(a op b)

Cuestiones relacionadas