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); }