为什么简单的算术不需要强制转换就不能工作?
本文关键字:转换 就不能 工作 不需要 简单 为什么 | 更新日期: 2023-09-27 18:06:43
我刚刚发现:
ushort i = 4;
i = i + 4;
给出编译错误:
不能隐式地将类型'int'转换为'ushort'。存在显式转换(您是否缺少强制类型转换?)
我必须这样修复它:
ushort i = 4;
i = (ushort)(i + 4);
这背后的原因是什么?难道使用所有数据类型不应该是显而易见和容易的吗?
文字4
是int
,因此i + 4
是int
的加法,i
被提升为int
。这个添加的结果也是int
,所以你不能在没有强制类型转换的情况下将它赋值给ushort
,因为c#不允许隐式转换到较小的数值类型。
原因是ushort + ushort实际上返回一个int。
这是因为编译器将4
视为integer
。从高级数据类型到低级数据类型的转换需要显式强制转换。
根据c#语言标准,特别是§2.4.4.2关于整数字面值的规定:
整型字面值的类型按如下方式确定:
如果字面量没有后缀,它具有以下类型中第一个可以表示其值的类型:int、uint、long、ulong。如果字面值以U或U为后缀,则它具有以下类型中可以表示其值的第一种类型:uint, ulong。如果字面值以L或L为后缀,则它具有可以表示其值的第一种类型:long, ulong。如果字面值的后缀为UL、UL、UL、UL、LU、LU、LU或LU,则为ulong类型。
所以你的数字被当作整型来处理,这就是为什么。
我认为从这些评论中得到的主要信息是int32只是当时通用架构使用的"默认"类型。我不知道当前处理器对较小整数类型的本机支持,但如果编译器在水下仍然将所有内容转换为int32,即使它是ushort,我也不会感到惊讶。
所以(u)short更像是程序员的验证约束,而不是内存节省器。即使它是一个内存节省器,如果需要更多的CPU周期来转换回和到usshort,我也不会感到惊讶。
整数类型的+
-操作只定义在int
、uint
、long
和ulong
对之间。为了计算i+4
,首先必须将i
从ushort
通过隐式数字转换转换为int
,结果是相同类型的-也是int
,因此i+4
的类型实际上是int
。由于没有隐式转换允许将int
赋值给定义为ushort
的变量,因此编译器会为i = i + 4
给出错误。
注意,您仍然可以使用下面的语句,因为+=
涉及隐式强制转换:
i += 4;