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();//能打印

相关推荐
hez20103 天前
在 .NET 上构建超大托管数组
c#·.net·.net core·gc·clr
雨落倾城夏未凉8 天前
第四章c#方法-参数数组和可选参数(16)
后端·c#
唐青枫10 天前
线程不是越多越快:C#.NET Thread 生命周期、同步与后台工作线程实战
c#·.net
唐青枫10 天前
别只会反射:C#.NET Emit 动态生成代码实战详解
c#·.net
咕白m62511 天前
.NET 环境下 Word 超链接批量提取方案
c#·.net
用户917215619021111 天前
C# 通信协议增量解析:用状态机处理半包和粘包
c#
小码编匠11 天前
C# 工控上位机必备:数据转换工具类与十个核心模块
后端·c#·.net
唐青枫13 天前
别再乱用 StartNew:C#.NET TaskFactory 任务调度实战详解
c#·.net
Artech14 天前
[MAF预定义的AIContextProvider-03]ChatHistoryMemoryProvider——赋予Agent从经验中学习的能力
ai·c#·agent·memory·maf
Scout-leaf15 天前
C#摸鱼实录——IoC与DI案例详解
c#