转换是将一种类型的表达式可以被视为另一种类型。转换可以是隐式的也可以是显式的
一、隐式转换
1.1.隐式数值转换:对于内置的数值类型(包括整型浮点型decimal字符型等)可以从存储量小的隐式转换为存储量大的数值(根本上说是能存储更多细节的)例如int能隐式转换为long float double等(转换是注意无符号数 可以把无符号数根据规则隐式转换为有符号数而反过来不行) 特别的对于char类型它可以隐式转换成其他类型但不能由其他类型隐式转换(比如Byte不能隐式转换成char)需要强制转换
1.2.隐式枚举转换:允许将十进制整数0转换为任何枚举类型
1.3.隐式引用转换:
·从任何引用类型到object
·从任何类类型S到任何类类型T(前提S是从T派生的)
·从任何类类型S到任何接口类型T(前提是S实现了T)
·从任何接口类型S到任何接口类型T(前提是S是从T派生的)
·从元素类型为SE的数组类型S到元素类型为TE的数组类型T(前提是S和T只有元素类型不同即维数相同 SE和TE都是引用类型 存在从SE到TE的隐式引用转换)
·从任何数组类型到System.Array
·从任何委托类型到System.Delegate
·从null类型到任何引用类型
注意:引用转换无论是隐式的还是显式的都不会更改所转换的对象的引用标识即虽然引用转换可能改变该引用的类型但绝不会更改所引用对象的类型或值(可以用指针理解 即转换只是改变了指针的类型而不会改变指针指向的内存中的内容)
1.4.装箱转换:将一个值类型隐式转换为引用类型(装箱和拆箱在值类型和引用类型间架起一座桥梁他让任何类型的值都可以按对象处理)
·从任何值类型(包括枚举结构)到类型object
·从任何值类型到类型System.ValueType
·从任何值类型到值类型实现的任何接口类型
·从任何枚举类型到System.Enum类型
装箱操作是分配一个对象实例并将子类型的值复制到该实例中
二、显式转换
2.1.显式数值转换:将一个存储量大的类型转化到一个存储量小的类型可能会出现信息的缺失所以必须要强制转换用强制转换符()
由于强制类型转换有可能丢失信息或者导致引发异常所以有两个关键字checked和checked来检测
·在checked上下文中如果源操作数的值在目标类型的范围中转换就会成功但如果源操作数的值在目标类型之外这会引发System.OverflowException
·在unchecked上下文中(unchecked为默认的)转换中会成功但转换后的值不会检测是否溢出可能不是你想要的值
2.2.显式枚举转换:可以将内置值类型与枚举类型或者枚举类型之间进行相互的转换
2.3.显式引用转换:
·从object类转换到任何其他引用类型
·从任何类类型S到任何类类型T(前提S是T基类)
·从任何类类型S到任何接口类型T(前提是S未密封并且S不实现T)
·从任何接口类型S到任何接口类型T(前提是T未密封或T实现S)
·从元素类型为SE的数组类型S到元素类型为TE的数组类型T(前提是S和T只有元素类型不同即维数相同 SE和TE都是引用类型 存在从SE到TE的显式引用转换)
·从System.Array及它实现的接口到任何数组类型
·从System.Delegate及他实现的接口到任何委托类型
为了使显式引用转换在运行是成功源操作数的值必须为null,或者源操作数所引用的对象的实际类型必须是一个可通过隐式引用转换转换为目标类型的类型 如果显式引用转换失败则将引发System.InvalidCastException
2.4.拆箱:拆箱需要首先检查该对象实例是否是某个给定的值类型的装了箱的值然后将值从实例中复制出来
·从类型object到任何值类型
·从类型System.ValueType到任何值类型
·从任何接口类型到实现了该接口类型的任何值类型
·从System.Eunm类型到任何枚举类型
三、用户定义转换
C#中允许用户定义转换但有条件:
·不能重新定义已存在的隐式或者显式转换
·自由S和T是不同的类型 S和T中有一个属于类类型或结构类型且包含了运算符声明 S和T都不是object类型或者接口类型 T和S不能是基类的关系时才允许类或者结构声明从源类型S到目标类型T的转换
·详情在操作符重载中描述
四、System.Convert类
此类实现了将一个基本数据类型转换为另一个基本数据类型的一系列方法(其中的方法全部静态的)
比较重要的是将一个string转换成一个数值类型因为如果调用ReadLine()函数得到的是一个字符串要想用于计算需要调用Convert类中相应的方法(例如ToInt32()方法)将其转换为值进行计算
五、程序示例
缺少后补上