我有以下代码:
Int16 myShortInt;
myShortInt = Condition ? 1 :2;
此代码导致编译器错误:
不能将'int'类型转换为'short'
如果我以扩展格式编写条件,则没有编译器错误:
if(Condition)
{
myShortInt = 1;
}
else
{
myShortInt = 2;
}
为什么会出现编译错误?
答案 0 :(得分:7)
您收到错误,因为默认情况下字面整数被视为int
,而int
由于精度损失而未隐式转换为short
- 因此编译错误。带有小数位的数字,例如1.0
,默认情况下会被视为double
。
此答案详述了可用于表达不同文字的修饰符,但遗憾的是,您无法对short
执行此操作:
C# short/long/int literal format?
因此,您需要明确投射int
:
myShortInt = Condition ? (short)1 :(short)2;
或者:
myShortInt = (short)(Condition ? 1 :2);
<小时/> 在某些情况下,编译器可以为您执行此操作,例如将适合
short
的文字整数值分配给short
:
myShortInt = 1;
不确定为什么没有扩展到三元行动,希望有人可以解释其背后的原因。
答案 1 :(得分:1)
默认情况下,1
和2
等平面广告被视为整数,因此您的?:
会返回int
,必须将其转换为short
:
Int16 myShortInt;
myShortInt = (short)(Condition ? 1 :2);
答案 2 :(得分:0)
你可以写:
Int16 myShortInt;
myShortInt = Condition ? (short)1 : (short)2;
或
myShortInt = (short) (Considiton ? 1 : 2);
但是,正如亚当已经回答的那样,C#认为整数文字是整数,除非是你所说的超简单案例:
short x = 100;
答案 3 :(得分:0)
编译代码时,它看起来像这样:
有:
Int16 myShortInt;
myShortInt = Condition ? 1 :2;
看起来像
Int16 myShortInt;
var value = Condition ? 1 :2; //notice that this is interperted as an integer.
myShortInt = value ;
while for:
if(Condition)
{
myShortInt = 1;
}
else
{
myShortInt = 2;
}
没有任何阶段将值作为int插入,并且文字被视为Int16。