csc在處理byte類型時,其實是有一些規則的,平時我們寫代碼可能沒有注意。
舉個例子:
//有幾行這樣的代碼
byte a = 1;
byte b = 2;
//byte sum = a+b; //incorrect
Console.WriteLine((a + b).GetType());static void Main()
{
byte a = 1;
byte b = 2;
//byte sum = a+b; //incorrect
Console.WriteLine((a + b).GetType());
Console.WriteLine((a - b).GetType());
Console.WriteLine((a * b).GetType());
Console.WriteLine((a / b).GetType());
Console.Read();
}
猜測一下GetType()之後輸出的結果是什麼呢?我相信肯定有些人會理所當然說是byte 了,
那麼你錯了 。其實應該是System.Int32類型的,被注釋的代碼其實是有問題的。
這個問題可以說是編譯器在處理byte類型的運算的一個規則,在byte類型上運用+,-,*,/運算子時,
都被 隱式地轉換為System.Int32類型了。所以注釋的代碼需要顯示地轉換為byte類型,如: sum = (byte)a+b。
上面的輸出結果其實全是:System.Int32
說得這裡,其實還有一個看起來更莫名其妙的規則,先看看,還是在先前的代碼上小小修改了一些
static void Main()
{
byte a = 1;
byte b = 2;
byte c;
c = b + 1; //錯誤
c = b += 1; //正常
//輸出結果?
Console.WriteLine((b + 2).GetType());
//這個輸出又是什麼呢?
Console.WriteLine((b+=2).GetType());
Console.Read();
}
其實上面代碼就一個小區別, + 與 += 的區別,很多人不明白 c = a += 1; 這個語句為什麼可以編譯通過,
a+=1 按 “道理” 來講應該就是我們上面代碼的測試結果,先計算右邊的運算式值,得到 2賦給c 變數,所以理論上應該是 System.Int32類型的,應該報編譯錯誤,其實不然,這也是編譯器在處理 byte類型的一個運算規則,如果不是很明白,
我用refloctor再次對它剝離一次,看清楚它的真實面目。
private static void Main()
{
byte a = 1;
byte b = 2;
byte c = b = (byte) (b + 1); //注意這行
Console.WriteLine((b + 2).GetType());
//注意下面這行
Console.WriteLine((b = (byte) (b + 2)).GetType());
Console.Read();
}
再看看上面的代碼,一目瞭然了吧,編譯器在處理 c = b+=1 時,直接把+=運算結果顯示地轉換為 byte類型了,怪不得不會編譯出錯,我想它應該就是編譯器所謂的 “潛規則” 吧,:)
內容不多,但都是我們平時寫代碼時應該注意的一些問題,歡迎大家拍磚!