2015-09-17 50 views
4

我在所述行爲失腳是按位或運算不允許在原始類型大於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,sbyteushort

據我所知,算術和邏輯操作被用於32位,以及較大的類型(intlong ...)中所定義,因爲它的處理器提供什麼(see this question),和更短的類型的被加寬,並且可以轉換回8或16位。然而,這是否有理由在一個賦值運算符中工作?首先,我假設在幕後,short被鑄造爲int,但是您將得到一個賦值/返回值short value = (some int),這應該會產生一個錯誤,因爲該轉換不是隱含的。

在不同的筆記:我在Visual Studio的直接窗口中嘗試了一些代碼,但在那裏,更多的代碼似乎工作。即時窗口可能會進行一些隱式投射,這通常是明確的。例如,short a = (int)5;被允許在直接窗口中。所以這沒有幫助。

+2

短添加(短a,短b){返回(短)(a + b); } –

+2

http://stackoverflow.com/questions/4343624/integer-summing-blues-short-short-problem –

+1

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)。 –

回答

1

然而,就是有一個原因,這將在賦值運算符的工作?

是:因爲否則賦值運算符不可能爲這些類型的工作 - 就沒有語法,允許它的工作。 期望a += ba &= b是清楚的,所以轉換是自動執行的。

a + ba & b,你已經注意到:由於性能原因,語法存在回來,特別是(short)(a+b)

+0

你能擴展這個*期望*的東西嗎?因爲對於我的期望,當'+'操作符沒有被定義時,我肯定不會認爲定義了'+ ='。所以我會*期望*沒有語法來使它工作。 – hschmauder

+1

@hschmauder在C#中,賦值運算符**不能**被顯式重載;它們使用二元運算符隱式地重載。含義:如果支持'+',那麼'+ ='也被解釋爲'a + = b;'=>'a =(AType)(a + b);' –

+0

「可疑的要求我。我懷疑這種影響是巨大的,尤其是因爲JITter在許多情況下能夠透明地擴大。 – CodesInChaos

2

真正的錯誤是由於在對它們進行操作時將較小整數類型隱式轉換爲int

當你有a & b其中abshort S,它們都被轉換成int和&經營者申請,其結果將是int類型的,所以你不能在你的方法聲明返回intshort。一個簡單的演員將解決這個問題。 (short)(a & b)

short BitwiseAnd(short a, short b) { return (short)(a & b); } //no error! 

當你有

short BitwiseAndAssignment(ref short a, short b) { a &= b; } 

編譯器會投給你,如果沒有你永遠不能在較小的種類比int使用這些類型的運營商(+=*=,...)的。


下面會發生什麼?

short a = 1; 
short b = 2; 

short c = a + b; //error! 

爲什麼?因爲+運算符沒有超載來接收兩個short參數。由於存在shortint之間的隱式轉換,因此方法解析將選擇具有兩個int作爲輸入參數的重載。所以它會投abint然後調用所選的超載返回一個int。因爲它返回一個int,所以您不能將它存儲在short變量中,因此您需要明確地轉換它。

short c = (short)(a + b)//this will work 
+0

啊,感謝您的回答,我瞭解了Marc對上述不可用語法的回答。謝謝! – hschmauder