2010-07-29 74 views
5

我注意到在C#中使用byte s上的按位異或運算符有一些奇怪的地方。至少奇怪我的想法。C#異或運算符:^ vs^=和隱式類型轉換

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

我也看到使用short這個問題,但沒有intlong

我認爲最後兩行是相同的,但似乎並非如此。這裏發生了什麼?

+0

我同意這看起來很奇怪。儘管如此,@ matthew-flaschen釘了它。 – kbrimington 2010-07-29 21:03:23

回答

9

沒有異或運算符需要並返回字節。因此C#隱含地將輸入字節擴展爲整數。但是,它確實而不是隱含地縮小了結果int。因此,你在第二行得到了給定的錯誤。然而,§14.14.2的the standard(化合物賦值)規定:

如果返回 類型的選擇的運營商是 顯式轉換爲的 x中的類型,和如果y是隱式轉換 到x或者運算符的類型是 移位運算符,則操作是 ,評估爲x =(T)(x op y),其中T 是x的類型,除了x是 只計算一次。

x和y(輸入)都是字節。您可以明確地將int縮小爲一個字節,並且顯然一個字節可以隱式轉換爲一個字節。因此,有一個隱含的演員。

1

在大多數C語言中,運營商會將小於int的類型推廣到int

在這種語言中,a op= b相當於a = (typeof a)(a op b)