5
short s;
s = (EitherTrueOrFalse()) ? 0 : 1;

这失败了:

错误 CS0266:无法将类型“int”隐式转换为“short”。存在显式转换(您是否缺少演员表?)

谁能解释为什么会这样?我唯一能想到的是编译器不查看第二个值并且不知道两者之间的范围,在这种情况下我写了类似的东西

short s;
s = (EitherTrueOrFalse()) ? 0 : 65000;

正确的?唯一的解决办法是丑陋的演员阵容?

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

4

3 回答 3

11

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

short s;
s = CallSomeMethodReturningInt32();

就编译器而言。

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

short s = (EitherTrueOrFalse()) ? (short) 0 : (short) 1;

做出整体表达型short。在这种特殊情况下,很遗憾没有数字文字后缀来显式声明short文字。显然语言设计者确实考虑到了这一点,但认为这是一种相对罕见的情况。(我想我可能会同意。)

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

6.1.8 隐式常量表达式转换

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

  • 类型的常量表达式(第 7.18 节) int可以转换为 sbyte、 byteshortushortuint或类型ulong,前提是 常量表达式的值在目标类型的范围内。
  • type的 常量表达式long可以转换为 type ulong,前提是常量表达式的 值不是负数。
于 2009-11-04T10:04:20.243 回答
1

因为转换是由编译器完成的,而不是在运行时完成的,所以我不会称它为丑陋的转换,我会称它为复杂的语法:

s = (EitherTrueOrFalse()) ? (short)0 : (short)1;

我的意思是,这就是它用 C# 编写的方式,即使它看起来很丑。

请参阅此博客文章。请参阅Marc Gravell对该问题的回答。

于 2009-11-04T10:05:03.130 回答
0

我想这与无法编译的原因相同:

short s1 = GetShort1();
short s2 = GetShort2();
short s3 = s1 + s2;

即,只要将short 用于某事,它就会被提升为int。

于 2009-11-04T10:07:52.030 回答