在if块中将short转换为int

时间:2013-08-08 11:15:12

标签: c# casting

我有以下代码:

Int16 myShortInt;  
myShortInt = Condition ? 1 :2;

此代码导致编译器错误:

  

不能将'int'类型转换为'short'

如果我以扩展格式编写条件,则没有编译器错误:

if(Condition)  
{  
   myShortInt = 1;  
}  
else  
{  
   myShortInt   = 2;  
} 

为什么会出现编译错误?

4 个答案:

答案 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)

默认情况下,12等平面广告被视为整数,因此您的?:会返回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。