为什么没有铸造的简单算术工作?

时间:2013-03-29 15:26:23

标签: c# casting

我刚发现这个:

ushort i = 4;
i = i + 4;

给出编译器错误:

  

无法将类型'int'隐式转换为'ushort'。存在显式转换(您是否错过了演员?)

我必须解决这个问题:

ushort i = 4;
i = (ushort)(i + 4);

这背后的原因是什么?不应该明显且易于使用所有数据类型吗?

6 个答案:

答案 0 :(得分:6)

文字4int,因此i + 4int添加,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)

整数类型的+ - 操作符仅在intuintlongulong对之间定义。要计算i+4首先i必须从ushort转换为隐式数字转换为int,结果属于同一类型 - 同时int因此i+4的类型实际上是int。由于没有隐式转换允许将int分配给定义为ushort的变量,因此编译器会为i = i + 4提供错误。

请注意,您仍然可以使用以下内容,因为+=涉及隐式转换:

i += 4;

答案 5 :(得分:0)

我认为从评论中删除的主要内容是int32只是当时公共架构使用的“默认”类型。我不知道当前处理器对较小整数类型的本机支持,但如果编译器在水下仍然将所有内容仍然转换为int32,即使它是一个ushort,我也不会感到惊讶。

所以(u)short更像是程序员的验证约束而不是内存保护程序。即使它是一个内存保护程序,如果需要更多的CPU周期来转换回用户,我也不会感到惊讶。