C# 不让我把两条短裤和一条短裤相加

C# 不让我把两条短裤和一条短裤相加,c#,type-conversion,C#,Type Conversion,我有一个密码: static short Sum(short a, short b) { return a + b; } 而且它不编译,saynig无法将“int”转换为“short”。我今天可能真的很累,但我看不出问题所在 当您将两条短裤加在一起时,它们的总和可能超过一条短裤的允许值,但对于int,它们的总和是一个OK值。这几乎就是埃里克·利珀特在书中所说的 旁白:为什么添加两个ints并返回一个long?Eric也提到了这一点: 在

我有一个密码:

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

而且它不编译,saynig无法将“int”转换为“short”。我今天可能真的很累,但我看不出问题所在

当您将两条短裤加在一起时,它们的总和可能超过一条短裤的允许值,但对于
int
,它们的总和是一个OK值。这几乎就是埃里克·利珀特在书中所说的


旁白:为什么添加两个
int
s并返回一个
long
?Eric也提到了这一点:

在一个以整数运算为中心的世界里,用int进行所有计算要明智得多,int类型的计算可能有足够的范围让典型的计算不会溢出


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

这就是为什么会出现编译时错误-返回的是
int
,其中指定的是
short
返回类型“”

如果您知道添加操作将始终导致
short
,则可以显式将结果强制转换为
short

static short Sum(short a, short b)
{
    return (short)(a + b);
}
而且它不编译,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位整数的整数运算?)

不管怎样,为什么会这样并不重要——这只是语言的规则

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

Jon Skeet有你的代码不起作用的原因,但他没有列出你需要做什么才能编译它。您可以使用以下选项:

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

这是一个不允许将两个
int
值相加以得到另一个
int
值的论点。是的,它们可以,但不必。我可以用ints来实现这一点,并期待很长的时间。@JonSkeet啊,但发生这种情况的可能性只有一半。@user970696:你可以期待,但你会失望的。如果添加
int.MaxValue
1
,则不会得到大于
int.MaxValue
long
值-您将得到
int.MinValue
@user970696-True,但不是语言的工作方式。设计者决定允许
int
s溢出,但不允许
short
s溢出。这是你的答案谢谢,所以即使我想使用尽可能少的内存,我也只需要在这里使用ints?@user970696:no,你可以使用:
return(short)a+b。但我会小心微观优化…@JonSkeet,它也不会编译(操作顺序)。你需要用帕伦斯的话来概括这句话。乔恩-为我辩护:@Oded:这很公平,但在这种情况下,这仍然是一个软弱的论点,尽管这意味着你不同意埃里克的观点。我去拿我的外套。没关系,我正在寻找一种方法来简单地引起溢出异常;)您应该考虑
short x
+
short y
超过短路最大值的情况;让它抛出一个异常@user970696导致溢出异常的最简单方法就是
抛出新的OverflowException()@aevitas,这取决于是否需要引发异常。在这两种情况下,您都应该在代码周围使用
checked
unchecked
块来获得所需的行为,而不是手动检查并抛出异常。我正在研究如何使C自然地导致异常,而不必使用内置机制。是的,
返回checked((short)(x+y));
static short Sum(short a, short b)
{
    return (short)(a + b);
}