转换

隐式转换   显示转换---强制转换(“不管是否发生数据丢失,都进行转换吧”)
1、数字转换
                        
    占据较少位数的数字类型可以隐式转换为占据较多位数的数字类型:
                                
2 溢出检测上下文
checked  unchecked 可以做运算符使用
            ushort sh = 2000;
            byte b;
            b = unchecked((byte)sh);//大多数重要的高位丢失了变成了208
            b = checked((byte)sh);//抛出OverflowException的异常
     ,也可以做语句使用。
            unchecked
            {
                b = (byte)sh;
                Console.WriteLine(b);
                checked
                {
                    b = (byte)sh;
                    Console.WriteLine(b);
                }
            }
3 引用转换

  classA { publicint Field1; }
  classB : A { publicint Field2;}
  classProgram2
  {
      staticvoid Main()
      {
         B b = newB();
         Console.WriteLine("{0}", b.Field1);
         Console.WriteLine("{0}", b.Field2);
         A a = (A)b;
         Console.WriteLine("{0}", a.Field1);
         Console.WriteLine("{0}", a.Field2);//编译错误对象a实际指向B类型的对象,即和对象b实际是指向内存中的相同对象,但对象a是属于类型A的对象,因此看不到B扩展部分
          }
  }
4 引用类型的显示和隐式转换
隐式引用转换:所有引用类型都可以被隐式转换为object类型;任何类型都可以隐式转换到它继承的接口;类可以隐式转换到它继承的父类;类可以隐式转换到它实现的接口。
显示引用转换是从一个普通类型转换到一个更精确类型的转换,包括从object类到任何引用类型的转换;从基类到继承它的子类的转换。
5 装箱转换
装箱:是一种值类型到引用类型的隐式转换,它接受值类型的值,根据这个值在堆上创建一个完整的引用类型对象并返回对象引用。
例如: int i=12object oi=null;  oi=i;     这就是一次装箱  在堆上创建i的引用对象
  int i = 10;   object oi = i;  i = 12;     oi = 15; 这里装箱后会产生两个副本:原始值类型和引用类型,各自可以独立操作。对i装箱并将引用赋值给oi
6 拆箱转换
拆箱:是将装箱后的引用类型显示转换为值类型的过程。 
int j = (int)oi;
7 自定义转换
自定义转换:用户为类或结构定义隐式或显示转换。
  classPerson
  {
        publicstring Name;
        publicint Age;
        public Person(string name, int age)
        {
            Name = name;
            Age = age;
        }
        publicstaticimplicit operatorint(Person p) //将Person转换为int
        {
            return p.Age;
        }
        publicstaticimplicitoperatorPerson(int i)
        {
            returnnewPerson("YXX", i);
        }
    }
    classProgram
    {
        staticvoid Main()
        {
            Person bill = newPerson("bill",25);           
            int age = bill;//将Person对象转换为int变量
            Console.WriteLine("Person Info:{0},{1}", bill.Name, age);
            Person anon = 35;//将int转换为Person对象
            Console.WriteLine("Person Info:{0},{1}", anon.Name, anon.Age);
        }
    }
其中,public和static修饰符是必需的。如果使用explicit,则定义的是显示转换,在使用时必须使用强制转换,
int age = (int)bill;
以上int age = bill;,还可以 float fAge=bill; 因为从int到float是系统定义的标准隐式转换。
8 is运算符
只能用与引用转换,装箱和拆箱转换,不能用于自定义转换。用来检查转换是否会成功完成。
if(bill is Person) //检测变量bill是否能成功转换为Person类型
9 as 运算符
p = bill as Person; 
if(p != null)
as运算符只能用于引用转换和装箱转换。as运算符和强制转换运算符类似,只是as不抛出异常,如果转换失败,就返回null。因此在使用前做判断,以检查是否转换成功。
原文地址:https://www.cnblogs.com/rwh871212/p/6963481.html