C#中对byte类型的处理还是很特殊的。
2016-10-08 16:01
183 查看
C#中对byte类型的处理还是很特殊的。
下面我用几行简单的代码来说明问题
byte x=1;
byte y=2;
byte z=x+y; //error:无法将int类型转换为byte类型
可能很多人会认为这段代码没有问题,实际上第三行会产生编译错误:无法将int类型转换为byte类型!
这是为什么呢?因为C#编译器会认为byte类型和byte类型运算的结果是int型,实际上对short类型也做了相似的处理。
至于为什么这样设计,我的看法是byte或short类型相互运算比较容易发生溢出,所以在运算的时候直接都转换为int来运算了。
再看下面的代码
byte i=1; //OK
这里的字面值1是被编译器识别为int类型的,在以上声明中,整数
1
从 int 类型隐式转换为 byte 类型。如果整数超出了 byte 类型的范围,则将发生编译错误。
上面是MSDN中的说法,实际上这个隐式转换违背了范围小的类型可以隐式转换为范围大的类型这条规则,但是在C#中这个转换的确是合法的。
注意这个转换只有用整型的字面值来赋值运算的时候才成立,像这样就不可以了:
int x=1;
byte i=x; //error: 无法将int类型转换为byte类型
在看下面的代码:
byte i=1;
i+=1; //OK
这行代码是可以通过的,原因是C#中x+=y并不是总相当于x=x+y的!
如果x+y的结果的类型可以隐式转换为x的类型,那么x+=y相当于x=x+y
如果x+y的结果的类型可以显式转换为x的类型,并且x=y也合法,那么x+=y相当于x=(T)(x+y),其中T是x的类型。
就像上面这行代码,i+1是int类型的,可以显式转换为byte类型,而i=1也合法,所以i+=1就相当于i=(byte)(i+1)
i=i+1; //error:无法将int类型转换为byte类型
这行比较容易理解,1被编译器识别为int类型,所以i+1的结果是int类型的,无法将int类型转换为byte类型
下面我用几行简单的代码来说明问题
byte x=1;
byte y=2;
byte z=x+y; //error:无法将int类型转换为byte类型
可能很多人会认为这段代码没有问题,实际上第三行会产生编译错误:无法将int类型转换为byte类型!
这是为什么呢?因为C#编译器会认为byte类型和byte类型运算的结果是int型,实际上对short类型也做了相似的处理。
至于为什么这样设计,我的看法是byte或short类型相互运算比较容易发生溢出,所以在运算的时候直接都转换为int来运算了。
再看下面的代码
byte i=1; //OK
这里的字面值1是被编译器识别为int类型的,在以上声明中,整数
1
从 int 类型隐式转换为 byte 类型。如果整数超出了 byte 类型的范围,则将发生编译错误。
上面是MSDN中的说法,实际上这个隐式转换违背了范围小的类型可以隐式转换为范围大的类型这条规则,但是在C#中这个转换的确是合法的。
注意这个转换只有用整型的字面值来赋值运算的时候才成立,像这样就不可以了:
int x=1;
byte i=x; //error: 无法将int类型转换为byte类型
在看下面的代码:
byte i=1;
i+=1; //OK
这行代码是可以通过的,原因是C#中x+=y并不是总相当于x=x+y的!
如果x+y的结果的类型可以隐式转换为x的类型,那么x+=y相当于x=x+y
如果x+y的结果的类型可以显式转换为x的类型,并且x=y也合法,那么x+=y相当于x=(T)(x+y),其中T是x的类型。
就像上面这行代码,i+1是int类型的,可以显式转换为byte类型,而i=1也合法,所以i+=1就相当于i=(byte)(i+1)
i=i+1; //error:无法将int类型转换为byte类型
这行比较容易理解,1被编译器识别为int类型,所以i+1的结果是int类型的,无法将int类型转换为byte类型
相关文章推荐
- c# webservice生成客户端及使用时碰到decimal类型时的特殊处理
- C#中对byte类型的处理。
- c# webservice生成客户端及使用时碰到decimal类型时的特殊处理
- C#(也适用其他)的初学者对string是值类型还是引用类型搞不清楚,还有对参数传递也比较迷糊
- 运用C#处理lob数据类型 (Oracle)
- Documentum中关于日期时间类型字段的特殊处理
- C#调用Win32 API如何处理指针类型的参数
- C#序列化出现“因其保护级别而不可访问。只能处理公共类型。”
- C# 类型 byte,int,short,long,decimal,double,float
- C#中string转换成字节byte的处理方法
- C#实现字符串转换到16进制byte类型
- 对于C#中插入数据(Ntext)类型超过大小8000提示处理!
- C#中对Oracle中Clob类型处理解析
- 特殊类型窗体制作: 用C#实现启动欢迎界面
- 运用C#处理lob数据类型 (Oracle)
- C# 如何判断计算机类型(台式机还是笔记本)
- C#byte 类型转 sbyte 类型
- C#中将Byte数组转化成DateTime类型
- COM导入到C#开发 HWND句柄类型 对应于C#的 _RemotableHandle结构处理
- 理解C# String类型:特殊的引用类型