C#不让我把两条短裤加到一个短的

我有一个代码:

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

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

并且它没有编译,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; 

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


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

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


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

这就是为什么你得到编译时错误 – 你返回一个int指定一个short返回类型`。

如果您知道添加将始终导致short则可以将结果明确地转换为short

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

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

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