为什么我添加了2个短片导致由于整数引起的转换编译错误?

在我的代码中,我有以下代码:

Order = config.DeploymentSteps.Select(x => x.Order).DefaultIfEmpty().Max() + 1; 

这给了我错误Cannot implicitly convert type 'int' to 'short' 。 作为参考Orderx.Order都是短路, Max()正确返回一个short (我已经validation了这一点)。 所以我明白了,它认为1是一个integer并且错误。 所以我改成了:

 Order = config.DeploymentSteps.Select(x => x.Order).DefaultIfEmpty().Max() + (short)1; 

我现在仍然得到相同的编译。 所以也许它不是正确的,所以我尝试将它改为

 Order = config.DeploymentSteps.Select(x => x.Order).DefaultIfEmpty().Max() + Convert.ToInt16(1); 

但我仍然得到同样的错误。 最后我通过转换整个表达式来实现它:

 Order = Convert.ToInt16(config.DeploymentSteps.Select(x => x.Order).DefaultIfEmpty().Max() + 1); 

为什么我不能把1 short并将它添加到另一个短片中,而不是将整个东西投入?

这是因为short + short = int。

Eric Lippert 在这里解释。

他说:

为什么短而短的结果是int?

好吧,假设空头和空头很短,看看会发生什么:

short [] price = {10000,15000,11000}; 短期平均=(价格[0] +价格[1] +价格[2])/ 3; 当然,如果这个计算是短暂的,那么平均值是-9845。 总和大于最大可能的短,所以它包围负数,然后你除负数。

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

尽管它听起来多余,你是否会介意声明一个短变量(或者可能是一个const)并将其初始化为1并在分配Order变量时使用它。 与int或long不同,没有指定short的文字方式。

C#语言规范(下载链接)列出了预定义的附加运算符。 对于整数类型,这些是:

 int operator +(int x, int y); uint operator +(uint x, uint y); long operator +(long x, long y); ulong operator +(ulong x, ulong y); 

你必须施放的原因是因为没有特定的操作员来添加短路。 我知道“因为C#是这样工作的”并不是一个特别有用的答案,但你去了。 我只想跟:

 Order = (short) config.DeploymentSteps.Select(x => x.Order).DefaultIfEmpty().Max() + 1; 

要么:

 Order = config.DeploymentSteps.Select(x => x.Order).DefaultIfEmpty().Max(); Order++;