我刚发现这个:
ushort i = 4;
i = i + 4;
给出编译器错误:
无法将类型'int'隐式转换为'ushort'。存在显式转换(您是否错过了演员?)
我必须解决这个问题:
ushort i = 4;
i = (ushort)(i + 4);
这背后的原因是什么?不应该明显且易于使用所有数据类型吗?
答案 0 :(得分:6)
文字4
是int
,因此i + 4
是int
添加,i
被提升为int
。此添加的结果也是int
,因此您无法在没有强制转换的情况下将其分配给ushort
,因为C#不允许隐式转换为较小幅度的数字类型。
答案 1 :(得分:3)
原因是因为ushort + ushort实际上返回一个int。查看this thread了解更多详情,了解为何会出现这种情况。
答案 2 :(得分:0)
因为编译器将4
视为integer
。从较高数据类型到较低数据类型的转换需要显式转换。
答案 3 :(得分:0)
根据C#语言标准,特别是关于整数文字的§2.4.4.2:
整数文字的类型确定如下:
如果文字没有后缀,则它具有这些类型中的第一个,其值可以表示为:int,uint,long,ulong。 如果文字后缀为U或u,则它具有这些类型中的第一个,其值可以表示为:uint,ulong。 如果文字后缀为L或l,则它具有这些类型中的第一个,其值可以表示为:long,ulong。 如果文字后缀为UL,U1,uL,ul,LU,Lu,lU或lu,则为ulong类型。
所以你的号码被视为一个int,这就是原因。
答案 4 :(得分:0)
整数类型的+
- 操作符仅在int
,uint
,long
和ulong
对之间定义。要计算i+4
首先i
必须从ushort
转换为隐式数字转换为int
,结果属于同一类型 - 同时int
因此i+4
的类型实际上是int
。由于没有隐式转换允许将int
分配给定义为ushort
的变量,因此编译器会为i = i + 4
提供错误。
请注意,您仍然可以使用以下内容,因为+=
涉及隐式转换:
i += 4;
答案 5 :(得分:0)
我认为从评论中删除的主要内容是int32只是当时公共架构使用的“默认”类型。我不知道当前处理器对较小整数类型的本机支持,但如果编译器在水下仍然将所有内容仍然转换为int32,即使它是一个ushort,我也不会感到惊讶。
所以(u)short更像是程序员的验证约束而不是内存保护程序。即使它是一个内存保护程序,如果需要更多的CPU周期来转换回用户,我也不会感到惊讶。