C#显示转换和隐式转换

显示转换和隐式转换

为什么要转换?

类型转换,把一个类型转成另外一个类型,C#分为显示转换和隐式转换,主要区分点在于需不需要我们自己写代码进行转化,是否存在数据丢失问题。(编译器是否自动转换、是否存在数据丢失问题

隐式转换

编译器自动转换,并且不存在数据丢失的场景(例如值类型把小空间的数赋值给大空间的变量 如

int a=10;

double b=a;//编译器自动转换

Console.WriteLine(b);//10 数据没有丢失

把派生类赋值给基类对象

cs 复制代码
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();//能打印

相关推荐
samble12 小时前
从零搭建灌装监控系统(十九):单元测试实战,xUnit + 内存SQLite + 反射测试私有方法
c#·wpf·mvvm·modbus·工业控制
人道领域15 小时前
【面试八股速通篇01】锁与并发工具
java·开发语言·面试·c#
宇卿.15 小时前
C#字段、属性、索引器、常量
开发语言·计算机视觉·c#
程序员Linc16 小时前
ONNXOCRSharp 开源手记 02|v0.4.0 PDF识别
开发语言·pdf·c#·ocr·onnxocrsharp
慧都小妮子16 小时前
MSG 附件太占内存?Aspose.Email for .NET 26.9 延迟加载
c#·.net·aspose·内存优化·延迟加载·aspose.email·附件内存
慧都小妮子17 小时前
FastReport PDF/UA 导出:让出海 PDF 满足无障碍合规要求
pdf·c#·fastreport·报表导出·pdf/ua·pdf 无障碍
淡海水20 小时前
03-02-架构篇-Boehm GC架构解析
unity·架构·c#·gc·boehm
samble2 天前
从零搭建灌装监控系统(十八):自定义控件,三色灯与状态指示
c#·wpf·mvvm·modbus·工业控制
jun_bai2 天前
使用Aspose实现word文档合并,内容替换
windows·c#·word
字节暗面2 天前
客户端上报不可信:游戏服务端数据校验与对局重演设计
c#·游戏开发·服务端校验·反作弊