c#編譯器對byte型別的一些規則 (轉0

iDotNetSpace發表於2010-08-23
csc在處理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/--&gtstatic 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


      說得這裡,其實還有一個看起來更莫名其妙的規則,先看看,還是在先前的程式碼上小小修改了一些

<!--Code highlighting produced by Actipro CodeHighlighter (freeware)http://www.CodeHighlighter.com/--&gtstatic 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();
}


  其實上面程式碼就一個小區別,  + 與 += 的區別,很多人不明白 = a += 1; 這個語句為什麼可以編譯通過,

a+=1 按 “道理” 來講應該就是我們上面程式碼的測試結果,先計算右邊的表示式值,得到 2賦給c 變數,所以理論上應該是 System.Int32型別的,應該報編譯錯誤,其實不然,這也是編譯器在處理 byte型別的一個運算規則,如果不是很明白,

我用refloctor再次對它剝離一次,看清楚它的真實面目。

<!--Code highlighting produced by Actipro CodeHighlighter (freeware)http://www.CodeHighlighter.com/--&gtprivate 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型別了,怪不得不會編譯出錯,我想它應該就是編譯器所謂的 “潛規則” 吧,:)

 

   內容不多,但都是我們平時寫程式碼時應該注意的一些問題,歡迎大家拍磚!

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/12639172/viewspace-671642/,如需轉載,請註明出處,否則將追究法律責任。

相關文章