我在所述行爲失腳是按位或運算不允許在原始類型大於32位的更小的,但相應的分配操作在實際上允許:爲什麼對於短基元,有賦值運算符(&=,+ =)但沒有非賦值運算符(&,+)?
short BitwiseAnd(short a, short b) { return a & b; } // error
short BitwiseAndAssignment(ref short a, short b) { a &= b; } // works
short Add(short a, short b) { return a + b; } // error
short AddAssignment(ref short a, short b) { a += b; } // works
相同的行爲適用於其它短原語類型,如byte
,sbyte
和ushort
。
據我所知,算術和邏輯操作被用於32位,以及較大的類型(int
,long
...)中所定義,因爲它的處理器提供什麼(see this question),和更短的類型的被加寬,並且可以轉換回8或16位。然而,這是否有理由在一個賦值運算符中工作?首先,我假設在幕後,short
被鑄造爲int
,但是您將得到一個賦值/返回值short value = (some int)
,這應該會產生一個錯誤,因爲該轉換不是隱含的。
在不同的筆記:我在Visual Studio的直接窗口中嘗試了一些代碼,但在那裏,更多的代碼似乎工作。即時窗口可能會進行一些隱式投射,這通常是明確的。例如,short a = (int)5;
被允許在直接窗口中。所以這沒有幫助。
短添加(短a,短b){返回(短)(a + b); } –
http://stackoverflow.com/questions/4343624/integer-summing-blues-short-short-problem –
re'short a =(int)5;'在即時窗口中 - 也在常規C#中工作;這裏的值'5'和'(int)5'可以在編譯時完全處理和理解爲常量表達式;編譯器檢查這些常量表達式是否溢出等,並允許它。相反,如果你做'short a =(int)50000000;',編譯器會在**編譯時**(不是運行時)用[CS0031](https://msdn.microsoft.com/en-us/庫/ 879y0b2y(v = VS.90)的.aspx)。 –