天轰穿C#教程之隐式转换方式[原创]
2012-10-30 09:19
295 查看
上面已经说到,隐式转换就是不需要什么语法申明,例如:
byte bt = 1;
short s = 35;
int x = bt; //将byte类型直接交给int类型,这就是一次隐式转换
int y = s; //同上
转换有一个前提,那就是只要能保证值不会发生任何变化,类型转换就可以成功进行。但是,在转换之前编译器会判断一次,这个判断是不管值是否能够保证的。编译器只看类型的大小。所以隐式转换的前提是,位数小的类型向大的转换,且能够保证值不发生变化就可以自动转换。
上面两个实例你应该看出来了,都是扩大转换。比如下面实例,将int类型的转换为byte类型这样的缩小转换,要想也隐式实现就会出错,因为int类型比byte类型大,这就有可能导致数据丢失。所以编译器会提示错误,如下例,我们先申明一个int类型的变量,然后试图将这个int类型的变量隐式转换为byte类型。如图2-20
图 2-20
下表显示了预定义的隐式数值转换。隐式转换可能在多种情形下发生,包括调用方法时和在赋值语句中。
隐式转换需要注意以下几点:
可空类型隐式转换为其它可空类型,应遵循表上表非可空类型的转换规则。即int? 隐式转换为long?、float?、double?和decimal?。
非可空类型隐式转换为可空类型也遵循表上表中的转换规则,即int隐式转换为long?、float?、double?和decimal?。
可空类型不能隐式转换为非可空类型,此时必须进行显式转换,如下一节所述。这是因为可空类型的值可以是null,但非可空类型不能表示这个值。
从 int、uint 或 long 到 float 的转换以及从 long 到 double 的转换的精度可能会降低,但数值大小不受影响。
不存在到 char 类型的隐式转换。
不存在浮点型与 decimal 类型之间的隐式转换。
int 类型的常数表达式可转换为 sbyte、byte、short、ushort、uint 或 ulong,前提是常数表达式的值处于目标类型的范围之内。
另外,以下场合不适合隐式转换:
●int转换为short--会丢失数据
●int转换为uint--会丢失数据
●uint转换为int--会丢失数据
●float转换为int--会丢失小数点后面的所有数据
●任何数字类型转换为char --会丢失数据
●decimal转换为任何数字类型--因为decimal 类型的内部结构不同于整数和浮点数
●int? 转换为int--可空类型的值可以是null
这些如果一定要转换,就需要使用显示转换来强迫编译器进行转换了。
本文为天轰穿原著,转载请注明出处及作者!
byte bt = 1;
short s = 35;
int x = bt; //将byte类型直接交给int类型,这就是一次隐式转换
int y = s; //同上
转换有一个前提,那就是只要能保证值不会发生任何变化,类型转换就可以成功进行。但是,在转换之前编译器会判断一次,这个判断是不管值是否能够保证的。编译器只看类型的大小。所以隐式转换的前提是,位数小的类型向大的转换,且能够保证值不发生变化就可以自动转换。
上面两个实例你应该看出来了,都是扩大转换。比如下面实例,将int类型的转换为byte类型这样的缩小转换,要想也隐式实现就会出错,因为int类型比byte类型大,这就有可能导致数据丢失。所以编译器会提示错误,如下例,我们先申明一个int类型的变量,然后试图将这个int类型的变量隐式转换为byte类型。如图2-20
图 2-20
下表显示了预定义的隐式数值转换。隐式转换可能在多种情形下发生,包括调用方法时和在赋值语句中。
隐式转换需要注意以下几点:
可空类型隐式转换为其它可空类型,应遵循表上表非可空类型的转换规则。即int? 隐式转换为long?、float?、double?和decimal?。
非可空类型隐式转换为可空类型也遵循表上表中的转换规则,即int隐式转换为long?、float?、double?和decimal?。
可空类型不能隐式转换为非可空类型,此时必须进行显式转换,如下一节所述。这是因为可空类型的值可以是null,但非可空类型不能表示这个值。
从 int、uint 或 long 到 float 的转换以及从 long 到 double 的转换的精度可能会降低,但数值大小不受影响。
不存在到 char 类型的隐式转换。
不存在浮点型与 decimal 类型之间的隐式转换。
int 类型的常数表达式可转换为 sbyte、byte、short、ushort、uint 或 ulong,前提是常数表达式的值处于目标类型的范围之内。
另外,以下场合不适合隐式转换:
●int转换为short--会丢失数据
●int转换为uint--会丢失数据
●uint转换为int--会丢失数据
●float转换为int--会丢失小数点后面的所有数据
●任何数字类型转换为char --会丢失数据
●decimal转换为任何数字类型--因为decimal 类型的内部结构不同于整数和浮点数
●int? 转换为int--可空类型的值可以是null
这些如果一定要转换,就需要使用显示转换来强迫编译器进行转换了。
本文为天轰穿原著,转载请注明出处及作者!
相关文章推荐
- 天轰穿C#教程之数据类型安全与转换【原创】
- 天轰穿C#教程之显示转换[原创]
- 天轰穿C#教程之if语句【原创】
- 天轰穿C#教程之C#预处理指令【原创】
- 天轰穿C#教程之数学运算符【原创】
- c#自定义类型的转换方式operator,以及implicit(隐式)和explicit (显示)声明的区别
- 天轰穿C#教程之值类型[原创]
- C/C++日常学习总结(第十二篇)将构造函数声明为explicit(显式)的方式可以抑制隐式转换
- c#自定义类型的转换方式operator,以及implicit(隐式)和explicit (显示)声明的区别
- 天轰穿C#教程之sizeof运算符【原创】
- 天轰穿C#教程之运算符的优先级【原创】
- ecshop添加配送方式教程(原创)
- [C语言教程]指针转换方式实现C语言的指针操作安全代码
- 天轰穿C#教程之装箱和拆箱[原创]
- 数据类型,隐式转换以及json,对象,引用类型,预解析 视频教程
- Scala学习教程笔记三之函数式编程、集合操作、模式匹配、类型参数、隐式转换、Actor、
- 天轰穿C#教程之#region和#endregion介绍[原创]
- 天轰穿C#教程之#define和#undef【原创】
- 天轰穿C#教程之#pragma介绍[原创]
- 天轰穿C#教程之变量的申明[原创]