c#编译器对byte类型的一些规则

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;    // i nc orrect

  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();
}


  其实上面代码就一个小区别,  + 与 += 的区别,很多人不明白 = 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类型了,怪不得不会编译出错,我想它应该就是编译器所谓的 “潜规则” 吧,:)

 

   内容不多,但都是我们平时写代码时应该注意的一些问题,欢迎大家拍砖!

 

转载于:https://www.cnblogs.com/repository/archive/2010/08/16/1800991.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值