18

我有一个代码:

static short Sum(short a, short b)
        {
            return a + b;
        }

而且它不能编译,saynig 不能将 'int' 转换为 'short'。我今天可能真的很累,但我看不到问题!

4

3 回答 3

31

而且它不能编译,saynig 不能将 'int' 转换为 'short'。我今天可能真的很累,但我看不到问题!

这只是语言的定义方式。整数类型的 + 运算符定义为:

static uint op +(uint x, uint y)
static int op +(int x, int y)
static ulong op +(ulong x, ulong y)
static long op +(long x, long y)

根据需要提升操作数。

现在至于为什么这样定义它 - 老实说,我不知道。我不赞成“因为它可能溢出”的论点——这表明byte + byte应该将其定义为 return short,并且int + int应该 return long,这两者都不是真的。

我在某处听说它可能与性能有关,但我不想肯定地说。(也许处理器通常只提供 32 位和 64 位整数的整数运算?)

无论哪种方式,为什么会这样并不重要——这只是语言的规则。

请注意,复合赋值运算符有一个隐式转换回相关类型,因此您可以编写:

short x = 10;
short y = 20;
x += y;
于 2012-08-07T20:29:34.853 回答
7

当您将两条短裤相加时,它们的总和可以超过一个短裤的允许值,但对于一个int. 这几乎就是 Eric Lippert 在他的回答中所说的。


int旁白:为什么添加两个s 返回 a不是这种情况long?Eric 也解决了这个问题:

在整数算术环绕的世界中,在 int 中进行所有计算更为明智,这种类型可能具有足够的范围以使典型计算不会溢出。


因此,+定义添加两个shorts 的运算符返回一个int

这就是您收到编译时错误的原因 - 您正在返回int指定short返回类型的位置。

short如果您知道加法将始终导致 a ,则可以将结果显式转换为short

static short Sum(short a, short b)
{
    return (short)(a + b);
}
于 2012-08-07T20:27:08.890 回答
1

Jon Skeet详细解释了为什么您的代码不起作用,但他没有列出您需要做什么才能编译它。您可以使用以下内容:

static short Sum(short a, short b)
{
    return (short)(a + b);
}
于 2012-08-07T20:33:15.020 回答