我有以下代码:
Int16 myShortInt;
myShortInt = Condition ? 1 :2;
此代码导致编译器错误:
不能将类型“int”隐式转换为“short”
如果我以扩展格式编写条件,则没有编译器错误:
if(Condition)
{
myShortInt = 1;
}
else
{
myShortInt = 2;
}
为什么会出现编译器错误?
int
您收到错误是因为默认情况下将文字整数视为并且int
不会short
因为精度损失而隐式转换为 - 因此编译器错误。具有小数位的数字,例如默认情况下1.0
被视为double
。
这个答案详细说明了哪些修饰符可用于表达不同的文字,但不幸的是你不能这样做short
:
所以你需要明确地转换你的int
:
myShortInt = Condition ? (short)1 :(short)2;
或者:
myShortInt = (short)(Condition ? 1 :2);
short
给 a short
:
myShortInt = 1;
不知道为什么不将其扩展到三元动作,希望有人可以解释其背后的原因。
1
默认情况下,像和一样的平面编号2
被视为整数,因此您?:
返回 a int
,必须将其转换为short
:
Int16 myShortInt;
myShortInt = (short)(Condition ? 1 :2);
你可以写:
Int16 myShortInt;
myShortInt = Condition ? (short)1 : (short)2;
或者
myShortInt = (short) (Considiton ? 1 : 2);
但是,是的,正如 Adam 已经回答的那样,C# 将整数文字视为整数,除了在您所说的超级简单的情况下:
short x = 100;
编译代码时,它看起来像这样:
为了:
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。