C# 两条短裤加在一起,don';不等于短?

C# 两条短裤加在一起,don';不等于短?,c#,C#,可能重复: 我对这种情况感到很傻,但我以前从未有过这种情况。我正在努力做到以下几点: foreach (short a in answers) { if (a != myConstants.NOTCOMPLETE_SHORT) { result = result + a; } else { empty = true; break; } } 答案是一系列的短裤。intellisen

可能重复:

我对这种情况感到很傻,但我以前从未有过这种情况。我正在努力做到以下几点:

foreach (short a in answers)
{
     if (a != myConstants.NOTCOMPLETE_SHORT)
     {
         result = result + a;
     }
     else
     {
         empty = true;
         break;
     }
}
答案是一系列的短裤。intellisense告诉我result+a是一个int,我不能将它分配给short


我必须在这里遗漏一些非常基本的东西,但不允许将两个short加在一起并分配给一个short变量似乎很奇怪。

因为
short
是一个16位整数,如果你加上,比如说,
32000
32000
(都是有效的
short
s),您将得到
64000
,它不是有效的
short
作为
Int16。MaxValue
32767

因此,加法运算符必须返回32位Int,以防止结果可能溢出

更新:

为了好玩,我刚刚在PowerShell中尝试了以下内容:

PS C:\> ([System.Int32]::MaxValue + [System.Int32]::MaxValue).GetType().Name
Double

PS C:\> (10000000 + 10000000).GetType().Name
Int32
因此,如果需要,
Int32
可以转换为
Double


我要冒险说,加法过程中的边界检查更昂贵,因此只有在可能出现溢出(如两个字节或两个短字符)的情况下才应该进行,特别是当它们可能使用相同的内存量时。我认为这正是语言的设计方式。

如果结果大于可能的最大短值,则算术可以结束(to-ve值)。由于short更可能发生这种情况,并且int的范围更大,short+short是int。

重载
运算符+=
或更改代码,以便:

short a = 6000;
short b = 6000;
result = (short) result + a //answer 12,000

正如在其他答案中已经指出的,有充分的理由说明为什么两个短字符构成int。加法赋值运算符+=重载返回一个短字符,因此您的代码将变为:

foreach (short a in answers)
{
    if (a == myConstants.NOTCOMPLETE_SHORT)
    {
         empty = true;
         break;
    }
    result += a;
}

请看Eric Lippert关于为什么会发生这种情况的回答:我有同样的想法,但我可以将同样的逻辑应用于ints,如果我把两个整数加在一起,那么这个值可能会比整数大,所以我必须把它分配给一个bigint。肯定认为这是返回整数的正确原因,因为一个加法*可能会导致一个需要超过16位的值…但是为什么必须*应用于短整数而不是整数的加法呢?真正奇怪的是,我也错了,Int16.MaxValue实际上是32767:)@peroija-在我的测试中,
Int32
似乎可以转换为
双精度。