8

我有以下代码:

Int16 myShortInt;  
myShortInt = Condition ? 1 :2;

此代码导致编译器错误:

不能将类型“int”隐式转换为“short”

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

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

为什么会出现编译器错误?

4

4 回答 4

7

int您收到错误是因为默认情况下将文字整数视为并且int不会short因为精度损失而隐式转换为 - 因此编译器错误。具有小数位的数字,例如默认情况下1.0被视为double

这个答案详细说明了哪些修饰符可用于表达不同的文字,但不幸的是你不能这样做short

C# 短/长/int 文字格式?

所以你需要明确地转换你的int

myShortInt = Condition ? (short)1 :(short)2;

或者:

myShortInt = (short)(Condition ? 1 :2);


在某些情况下,编译器可以为您执行此操作,例如将适合 a 的文字整数值分配short给 a short

myShortInt = 1;

不知道为什么不将其扩展到三元动作,希望有人可以解释其背后的原因。

于 2013-08-08T11:16:01.197 回答
1

1默认情况下,像和一样的平面编号2被视为整数,因此您?:返回 a int,必须将其转换为short

Int16 myShortInt;  
myShortInt = (short)(Condition ? 1 :2);
于 2013-08-08T11:16:50.953 回答
0

你可以写:

Int16 myShortInt;  
myShortInt = Condition ? (short)1 : (short)2;

或者

myShortInt = (short) (Considiton ? 1 : 2);

但是,是的,正如 Adam 已经回答的那样,C# 将整数文字视为整数,除了在您所说的超级简单的情况下:

short x = 100;
于 2013-08-08T11:17:20.827 回答
0

编译代码时,它看起来像这样:

为了:

Int16 myShortInt;  
 myShortInt = Condition ? 1 :2;

它看起来像

Int16 myShortInt; 
var value =  Condition ? 1 :2; //notice that this is interperted as an integer.
myShortInt = value ;

而对于:

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

中间没有阶段可以将值作为 int 进行交互,并且文字被视为 Int16。

于 2013-08-08T11:22:17.520 回答