《Illustrated C# 2012, 4th Edition》Daniel M. Solis 第16章 转换 笔记

隐式转换指编译器依据上下文自动进行的转换。
C#中无符号整数类型使用零扩展(zero extension),有符号整数类型使用符号扩展(sign extension)。
所有类型都可以隐式转换为object类型。
所有值类型都可以隐式转换为System.ValueType类型。

数字类型之间的转换:

数字类型之间的隐式转换:

checked运算符和checked语句可以检查类型转换时是否发生溢出,当溢出时抛出OverflowException异常。C#默认不做溢出检测。
checked和unchecked运算符用于表达式,checked和unchecked语句用于块。
checked检测溢出,unchecked不检测溢出:


checked和unchecked语句之间可以嵌套。

数字类型之间的显式转换:





引用转换改变对象内存中数据的可见性。
引用类型之间的隐式转换:

引用类型之间的显式转换:

  1. 存在从object到任何引用类型的显式转换。
  2. 存在从基类到它的派生类的显式转换。

引用类型之间的显式转换不一定都是有效的,无效的引用转换会抛出InvalidCastException异常,但不会导致编译错误。
值为null的引用的显式转换总是有效的。

装箱(boxing)是一种隐式转换。它在堆上创建值类型的副本,然后返回这个副本的引用。

拆箱(unboxing)是一种显式转换。它返回装箱在堆上创建的副本的原始类型的值。尝试将一个值拆箱为非原始类型,抛出InvalidCastException异常。

用户可以通过implicit和explicit关键字和public static修饰符自定义转换。但存在以下约束:

  1. 只以为类和结定自定义转换
  2. 不能重定义标准隐式或显式转换。
  3. 对于源类型S和目标类型T:
    1. S和T必须是不同类型。
    2. S和T不能有继承关系。
    3. S和T不能是接口或object类型。
    4. 转换运算符必须是S或T的成员。

一次完整的转换最多三个步骤:

  • 自定义转换至多出现一次。

is运算符可以检测一次转换是否会成功,会成功返回true,否则返回false。
is运算符只能用于标准引用转换、装箱和拆箱,不能用于自定义转换。

as运算符同样可以检测一次转换是否会成功,成功时返回目标类型的引用,否则返回null。
因为as运算符的目标类型限定为引用类型,所以只用于标准引用转换和装箱,不能用于到值类型的转换,也不能用于自定义转换。