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

Joh*_*n V 12 c# type-conversion

我有一个代码:

static short Sum(short a, short b)
        {
            return a + b;
        }
Run Code Online (Sandbox Code Playgroud)

而且它没有编译,saynig无法将'int'转换为'short'.我今天可能真的很累,但我看不出这个问题!

Jon*_*eet 27

而且它没有编译,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)
Run Code Online (Sandbox Code Playgroud)

根据需要提升操作数.

现在,作为原因为什么它的定义是这样-我不知道,说实话.我不买"因为它可能溢出"的论点 - 这表明byte + byte应该被定义为返回short,并且int + int应该返回long,这两者都不是真的.

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

无论哪种方式,它并不真正重要,为什么是这种情况-它的语言只是规则.

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

short x = 10;
short y = 20;
x += y;
Run Code Online (Sandbox Code Playgroud)

  • @Oded:足够公平,但在这种情况下,它仍然感觉像一个弱论点*即使这意味着不同意Eric*.我会得到我的外套. (4认同)

Ode*_*ded 6

当你将两个短裤加在一起时,它们可以加起来超过一个短的允许值,但是一个OK的值int.这正是Eric Lippert在他的回答中所说的.


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

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


因此,+运营商在添加两个shorts时定义了一个int.

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

short如果您知道添加将始终产生以下结果,则可以显式地转换结果short:

static short Sum(short a, short b)
{
    return (short)(a + b);
}
Run Code Online (Sandbox Code Playgroud)

  • 这是一个不让你将两个`int`值相加得到另一个`int`的论据. (2认同)
  • @JonSkeet啊,但发生这种情况的可能性只有一半. (2认同)