c#編譯器對byte型別的一些規則 (轉0
csc在處理byte型別時,其實是有一些規則的,平時我們寫程式碼可能沒有注意。
舉個例子:
//有幾行這樣的程式碼
byte a = 1;
byte b = 2;
//byte sum = a+b; //incorrect
Console.WriteLine((a + b).GetType());
猜測一下GetType()之後輸出的結果是什麼呢?我相信肯定有些人會理所當然說是byte 了,
那麼你錯了 。其實應該是System.Int32型別的,被註釋的程式碼其實是有問題的。
這個問題可以說是編譯器在處理byte型別的運算的一個規則,在byte型別上運用+,-,*,/運算子時,
舉個例子:
//有幾行這樣的程式碼
byte a = 1;
byte b = 2;
//byte sum = a+b; //incorrect
Console.WriteLine((a + b).GetType());
<!--Code highlighting produced by Actipro CodeHighlighter (freeware)http://www.CodeHighlighter.com/-->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();
}
{
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
說得這裡,其實還有一個看起來更莫名其妙的規則,先看看,還是在先前的程式碼上小小修改了一些
<!--Code highlighting produced by Actipro CodeHighlighter (freeware)http://www.CodeHighlighter.com/-->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();
}
{
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再次對它剝離一次,看清楚它的真實面目。
<!--Code highlighting produced by Actipro CodeHighlighter (freeware)http://www.CodeHighlighter.com/-->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();
}
{
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型別了,怪不得不會編譯出錯,我想它應該就是編譯器所謂的 “潛規則” 吧,:)
內容不多,但都是我們平時寫程式碼時應該注意的一些問題,歡迎大家拍磚!
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/12639172/viewspace-671642/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- c# 優化程式碼的一些規則——使用is或as和強制型別轉換的區別[三]C#優化型別
- java 基本型別的轉換規則Java型別
- JS資料型別轉換規則JS資料型別
- java 基礎型別與byte[]的轉換Java型別
- 禁用 C# 編譯器對某段程式碼的警告C#編譯
- SELinux策略語言--型別強制(編寫TE規則)Linux型別
- 編碼規則指南(轉貼)
- java編譯器的一些感悟Java編譯
- TypeScript型別系統基本規則TypeScript型別
- C++編譯器認為的指標型別(靜態聯編)C++編譯指標型別
- C# - char型別的一些介紹C#型別
- C# 型別轉換C#型別
- 【轉載】C++ ,C#資料型別對照C++C#資料型別
- Java中String和byte型別互相轉換Java型別
- byte位元組陣列 轉換成double型別陣列型別
- EF:oracle的number型別對映為C#的boolean型別Oracle型別C#Boolean
- FreeBSD中的GNU C編譯器--編譯器GCC(轉)編譯GC
- 程式碼靜態掃描規則——型別轉換檢查型別
- JavaScript 運算子規則與隱式型別轉換詳解JavaScript型別
- 為什麼C++編譯器不能支援對模板的分離式編譯 (轉)C++編譯
- 配置C#命令列編譯器C#命令列編譯
- JS直譯器之自動型別轉換:[]==![]JS型別
- c#編碼規範【轉載】C#
- 簡單討論資料型別(byte)強制轉化後的數值變化規律資料型別
- C#變數型別(1):引用型別和值型別 (轉)變數型別
- 編譯期型別檢查 in ClojureScript編譯型別
- 基於 XAF Blazor 的規則引擎編輯器Blazor
- 編譯型語言和解釋型語言的區別編譯
- -debug(C# 編譯器選項)C#編譯
- 微軟開源 C# 編譯器 Roslyn微軟C#編譯ROS
- php的編碼規則PHP
- JVM實用引數(一)JVM型別以及編譯器模式JVM型別編譯模式
- 『無為則無心』Python基礎 — 2、編譯型語言和解釋型語言的區別Python編譯
- 關於Java和C#的型別對比JavaC#型別
- 瞭解下C# 型別轉換C#型別
- (轉)編譯和連結的區別編譯
- C#學習 [型別系統] 型別轉換(11)C#型別
- C#的型別——值型別與引用型別C#型別