C#不会让我把两条短裤加成一条短线

时间:2012-08-07 20:26:14

标签: c# type-conversion

我有一个代码:

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

它没有编译,saynig无法转换' int'短暂的'。我今天可能真的很累但我看不出这个问题!

3 个答案:

答案 0 :(得分:26)

  

它没有编译,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以返回short,并且int + int应该返回long,两者都不是真的。

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

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

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

short x = 10;
short y = 20;
x += y;

答案 1 :(得分:5)

当您将两个短片一起添加时,它们可以加起来超过允许的短值,但int的值为OK。这正是Eric Lippert在his answer here中所说的。


除此之外:为什么不添加两个int返回long的情况?埃里克也是这样说的:

  

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


因此,添加两个+时定义的short运算符会返回int

这就是您收到编译时错误的原因 - 您要返回int,指定short返回类型`。

如果您知道 总是的结果导致short

,您可以将结果显式地转换为short
static short Sum(short a, short b)
{
    return (short)(a + b);
}

答案 2 :(得分:1)

Jon Skeet explained in detail为什么你的代码不起作用,但他没有列出你需要做什么才能编译。您可以使用以下内容:

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