短整型加短整型不等于短整型?

7

版本: Visual Studio Professional 2013 更新4
构建参数: Prefer 32-bit 为真

我不理解以下C#代码中的错误:

short iCount = 20;
short iValue = iCount + (short)1;

将一个转换为short的int类型加上一个short会导致以下错误:

无法隐式地将类型'int'转换为'short'。存在显式转换(是否缺少转换?)

上述错误也出现在以下情况中,这是完全合理的:

short iCount = 20;
short iValue = iCount + 1;

以下解决方法可以消除错误:
short iCount = 20;
short iValue = (short)(iCount + 1);

似乎使用 "short + Int32 常量" 的形式可以工作,并且结果是 Int32,需要强制转换为 short。

第一个代码示例失败的原因是什么,还是这是编译器的错误?(经过 4 次更新后我几乎不敢相信)


看一下这个答案 - Bobby Tables
Related - Sergey Kalinichenko
Related - weston
也相关:https://dev59.com/nmkw5IYBdhLWcg3wMHum - Habib
现代架构是为32位或64位算术而建立的。对于“+”运算符来说,将16位int提升为32位,然后进行32位加法并得到32位结果,这样更有效率。虽然可能出乎意料,但这是有设计意图的,正如C#参考中所指定的那样。 - Arin
然而,如果表达式是常量(在编译时已知),则从intshort的转换是“免费”的。例如:const int iCount = 20; short iValue = iCount + 1;请注意,两个加数都是int类型,因此和也是int类型,但在这些情况下,从intshort的转换是隐含的。 - Jeppe Stig Nielsen
1个回答

4

Int是最小的有定义+运算符的有符号类型,因此在short上尝试使用+会导致这种类型的错误。


有趣!可以在这里找到更完整的答案。 - Gimly

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接