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

时间:2011-09-21 18:34:15

标签: c# casting

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

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

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

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并将其添加到另一个简短的内容中,而不会抛出整个内容?

3 个答案:

答案 0 :(得分:5)

这是因为短+短= int。

Eric Lippert解释说here

他说:

  

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

     

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

     

短[] price = {10000,15000,11000};短期平均=(价格[0] +   价格[1] +价格[2])/ 3;当然,平均值是-9845   这个计算是短暂的。总和大于最大值   可能很短,所以它缠绕到负面,然后你分裂   负数。

     

在整数运算包围的世界中,它更多   明智地做int中的所有计算,这种类型很可能   有足够的范围进行典型计算以防止溢出。

答案 1 :(得分:1)

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

答案 2 :(得分:1)

C# language specification (download link)列出了预定义的附加运算符。对于整数类型,它们是:

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++;