在我的代码中,我有以下代码:
Order = config.DeploymentSteps.Select(x => x.Order).DefaultIfEmpty().Max() + 1;
这给了我错误Cannot implicitly convert type 'int' to 'short'
。由于参考Order
和x.Order
都是短片,Max()
正确返回short
(我已经验证了这一点)。所以我明白了,它认为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
并将其添加到另一个简短的内容中,而不会抛出整个内容?
答案 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++;