在三元语句中没有隐式int - > short转换

J F*_*J F 5 c# ternary-operator implicit-cast

short s;
s = (EitherTrueOrFalse()) ? 0 : 1;
Run Code Online (Sandbox Code Playgroud)

这失败了:

错误CS0266:无法将类型'int'隐式转换为'short'.存在显式转换(您是否错过了演员?)

任何人都可以解释为什么会这样吗?我能想到的唯一一件事就是编译器没有查看第二个值并且不知道两者之间的范围,在我编写类似的情况下

short s;
s = (EitherTrueOrFalse()) ? 0 : 65000;
Run Code Online (Sandbox Code Playgroud)

正确?唯一的解决方案是丑陋的演员?

此外,似乎C#没有短类型的类型后缀.这是一个非常严重的监督IMO.否则,这将是一个解决方案......

Jon*_*eet 11

编译器具有从常量表达式到各种基本类型的隐式转换(只要该值在适当的范围内),但这里的表达式不是常量 - 它只是一个int表达式.它与以下几乎完全相同:

short s;
s = CallSomeMethodReturningInt32();
Run Code Online (Sandbox Code Playgroud)

就编译器而言.

有两个选项 - 您可以转换整个表达式,或者转换后两个操作数中的每一个:

short s = (EitherTrueOrFalse()) ? (short) 0 : (short) 1;
Run Code Online (Sandbox Code Playgroud)

制作整体表达类型short.在这种特殊情况下,遗憾的是没有数字文字后缀来显式声明short文字.显然,语言设计师确实考虑过这一点,但觉得这是一种相对罕见的情况.(我想我可能会同意.)

关于隐式常量转换的部分来自C#3.0规范部分6.1.8:

6.1.8隐式常量表达式转换

隐式常量表达式转换允许以下转换:

  • 常数表达式型的(§7.18) int可被转化为类型为sbyte, , byte,short,ushort,uintulong,所提供的值 常数表达式是在目标类型的范围内.
  • 常数表达式类型的long可转换为类型ulong,提供的值常量表达式 不为负.