• 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;   //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();
    }
    复制代码

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

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

    转载自:http://www.cnblogs.com/repository/archive/2010/08/16/1800991.html

    谢谢浏览!

  • 相关阅读:
    BCB 如何让Application收到SendMessage发送来的消息
    用BCB 画 Code128 B模式条码
    遍历SQL SERVER中所有存储过程和触发器
    EXCEL导入数据到SQL SERVER 2008
    TListView控件的ReadOnly属性的一个Bug
    Using Microsoft Visual C++ DLLs with C++Builder
    行列转换的例子
    WCF 使用Stream模式进行文件上传 --节选自Packt.Net.Framework.4.5.Expert.Programming.Cookbook
    WCF Endpoint分类
    SQL Error: 1064, SQLState: 42000
  • 原文地址:https://www.cnblogs.com/Music/p/1801728.html
Copyright © 2020-2023  润新知