随笔 - 139  文章 - 0  评论 - 421  阅读 - 17万

C#中对byte类型的处理。

可能很多人都没有注意到,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类型的,在以上声明中,整数 1int 类型隐式转换为 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类型

 

 

posted on   周雪峰  阅读(4492)  评论(0编辑  收藏  举报
编辑推荐:
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
阅读排行:
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· [AI/GPT/综述] AI Agent的设计模式综述
< 2009年2月 >
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
1 2 3 4 5 6 7
8 9 10 11 12 13 14

点击右上角即可分享
微信分享提示