显示转换和隐式转换
为什么要转换?
类型转换,把一个类型转成另外一个类型,C#分为显示转换和隐式转换,主要区分点在于需不需要我们自己写代码进行转化,是否存在数据丢失问题。(编译器是否自动转换、是否存在数据丢失问题
隐式转换
编译器自动转换,并且不存在数据丢失的场景(例如值类型把小空间的数赋值给大空间的变量 如
int a=10;
double b=a;//编译器自动转换
Console.WriteLine(b);//10 数据没有丢失
把派生类赋值给基类对象
class Aninmal{} class Cat:Aninmal { public void Speak() { Console.WriteLine("miao"); } }Aninmal aninmal基类 new Cat();派生类
Aninmal aninmal = new Cat();//派生类对象
规则
值类型:小区间往大区间可以转换
引用类型:把子类对象赋值给父类对象
有符号不能往无符号去转换
显示转换
什么是显示转换
需要我们自己写转换代码,但会出现数据丢失的情况
语法:(需要转换的类型)变量:(int)a
值类型显示转换
int a1 = 300;
byte a2 = (byte)a1;//出现数据丢失
Console.WriteLine(a2);//44
int a3 = -129;
uint a4 = (uint)a3;
Console.WriteLine(a4);// 出现数据丢失
引用类型的显示转换
本质上是Animal对象,转成Cat,转换失败,程序会直接崩溃
Aninmal aninmal1= new Aninmal();//父类对象
Cat cat = (Cat)aninmal1;//强制转换cat类型,但是本质上是Animal对象,本质不能这样做,但是编译不会报错
cat.Speak();报错
as和is
如果想要类型安全转换,不让程序崩溃,可以通过as和is进行转换
Aninmal aninmal1 = new Aninmal();
Cat cat = aninmal1 as Cat;//如果转成失败为null 防止程序崩溃
if (cat != null) { cat.Speak(); }
if(aninmal1 is Cat c)//先判断再转换,aninmal是不是Cat对象,如果是Cat对象,转成c对象
{
c.Speak();//能调用但执行不了
}
is和as的区别
as先类型判断,在进行转换,转换失败为null,永远不抛异常、使用范围:不能使用值类型
is只有判断,如果写成aninmal1 is Cat c(模式匹配)这种类型,可以先判断在转换、返回值为true和false、可以使用任意类型
注意
//如果本质是Cat对象,强制转成Cat对象,可以整除转换
Aninmal aninmal2 = new Cat();//本质上是cat对象,
Cat cat1 = (Cat)aninmal2;
cat1.Speak();//能打印