1、转换的类型
预定义的转换:数字转换(显式转换,隐式转换),引用转换(显式转换,隐式转换),装箱转换,拆箱转换
用户自定义的转换: 隐式转换,显示转换
2、隐式/显示转换(强制转换)的适用情况
对于预定义的类型,若从源类型到目标类型不会发生数据丢失,c#会自动将一个数据类型转换为另一个数据类型,这种转换就是隐式转换。
若源类型的任意值在被转换成目标类型时会丢失值,c#不会提供这两种类型的自动转换,如果希望对这样的类型进行转换,就必须使用显式转换,
其语法格式为 (目标类型)源表达式
3、引用转换
(1)定义:接收源引用并返回一个指向堆中同一个位置的应用,但把引用标记为其他类型
(2)常见的隐式引用转换
所有引用类型可被隐式转换成object类型
任何类型可以隐式转换到它继承的接口
类可以隐式转换到它继承的链中的任何类,可以隐式转换到它实现的任何接口
(3)常见的显式引用转换(一个泛化引用类型转换到一个更具体的引用类型时发生)
从object类型到任何引用类型的转换
从基类到其子类的转换
4、装箱转换----值类型到引用类型的隐式转换
示例:int i=12; object oi=null; oi=i;//对i装箱,并把引用赋值给oi
系统对i进行装箱的操作如下:@1,在堆上创建了int 类型的对象。@2,将i的值复制到int对象。@3,返回int对象的引用,并保存到oi中。
5、拆箱转换-----把装箱后的对象转回值类型的显式转换
int i=12; object oi=i;//装箱i并把其引用赋值给oi
int j=(int)oi;//拆箱oi并把其对象的值赋值给j。尝试拆箱一个值为非原始类型时,会抛出一个InvalidCastException异常
6、用户自定义转换
语法:public static implicit/explicit operator TargetType (SourceType Identifier)
例如: public static implicit operator string(Number n)
{
return n.ToString();
}
@1、public static 是必需的,implicit,explicit分别表明为隐式或显式转换 operator为关键字。
@2、只可以为类或结构定义用户自定义转换
@3、不能重新定义标准隐式或显式转换
7、Is运算符-----检查转换是否成功
有些转换的请求是不成功的,并会在运行时抛出InvalidCastException异常。我们可用Is运算符检查转换是否成功,从而避免盲目转换
语法: 源表达式 is 目标类型
若源表达式可以通过引用,装箱,拆箱转换 转换成目标类型,则运算符返回true。
8、as运算符-----类似于显式转换的功能
as运算符和强制转换运算符相似,只是它不抛出异常,若转换失败,它把目标引用设为null
语法: 源表达式 as 目标类型(必须为引用类型)
只能用于引用转换和装箱转换