2010-07-29 15 views
5

Zauważyłem coś dziwnego w używaniu bitowego operatora XOR na byte s w C#. Co najmniej dziwne.Operatory XOR C#:^kontra^= i niejawna konwersja typów

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

widzę też ten problem przy użyciu short, ale nie int lub long.

Myślałem, że dwa ostatnie wiersze były równoważne, ale tak się nie wydaje. Co tu się dzieje?

+0

zgadzam wygląda dziwnie. @ matthew-flaschen jednak to załatwił. – kbrimington

Odpowiedz

9

Nie ma operatora XOR, który pobiera i zwraca bajty. Zatem C# niejawnie rozszerza bajty wejściowe na ints. Jednak nie jest to , a nie niejawnie zawęża wynik. W ten sposób otrzymujesz podany błąd w drugiej linii. Jednakże §14.14.2 (przyporządkowanie związek) o the standard stanowi:

czy typ wybranego operatora powrotu jest wyraźnie przekształcenia w rodzaju X i Y, jeśli jest niejawnie zamienny do typem x lub operatorem jest operator przesunięcia , a następnie operacja to obliczana jako x = (T) (x op y), gdzie T jest typem x, z tym że x jest oceniany tylko raz.

x i y (wejścia) to oba bajty. Można jawnie zawęzić int do bajtu i wyraźnie bajt jest niejawnie wymienialny na bajt. Tak więc istnieje niejawna obsada.

1

W większości języków w języku C, operatorzy będą promować typy mniejsze niż int do int.

W takich językach, a op= b jest równoważna a = (typeof a)(a op b)