【问题标题】:No implicit int -> short conversion in ternary statement三元语句中没有隐式 int -> 短转换
【发布时间】:2009-11-04 10:00:08
【问题描述】:
short s;
s = (EitherTrueOrFalse()) ? 0 : 1;

这失败了:

错误 CS0266:不能隐式 将类型“int”转换为“short”。一个 存在显式转换(你是 缺少演员表?)

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

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

对吗? 唯一的解决办法是使用丑陋的演员表?

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

【问题讨论】:

  • 你说得对,short 类型没有类型后缀。
  • short 类型没有类型后缀,但我几乎不会称其为“严重疏忽”。不知何故,我们 .net 开发人员设法应对了这种令人发指的残疾......
  • 嗯,出于某种原因,VB 拥有它...
  • 条件运算符中的 int/short 常量转换实际上会导致一些有趣的语言设计问题。如果您对这个主题感兴趣,请blogs.msdn.com/ericlippert/archive/2006/05/24/…

标签: c# ternary-operator implicit-conversion


【解决方案1】:

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

short s;
s = CallSomeMethodReturningInt32();

就编译器而言。

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

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

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

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

6.1.8 隐式常量表达式转换

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

  • 一个 constant-expression (§7.18) 类型 int 可以转换为 sbyte 类型, byteshortushortuint,或ulong, 提供的价值 constant-expression 在 目标类型的范围。
  • 一个 long 类型的 constant-expression 可以 被转换为类型ulong,提供 常量表达式的值 不是负数。

【讨论】:

  • 我不建议转换整个表达式,因为这将在运行时执行,而常量的转换由编译器执行。
  • 你的解释很有道理。是的,这是我第一次遇到它,所以认为它稀有或稀有可能是正确的。不过,可惜没有后缀。
【解决方案2】:

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

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

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

看到这个blog article。 有关该问题,请参阅 Marc Gravell's answer

【讨论】:

    【解决方案3】:

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

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

    即每当 short 用于某事时,它都会被提升为 int。

    【讨论】:

    • 不,这不是原因。这不是“每当 short 用于某事时”。特别是,如果 0 和 1 实际上是 s1 和 s2,那就没问题了。在您的情况下,加法失败的原因是没有定义加法运算符,因此这些值被提升为 int。
    • 或者,如果你愿意,stackoverflow.com/questions/1547216/…
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-05-16
    • 2015-07-14
    • 1970-01-01
    • 2021-12-14
    • 1970-01-01
    相关资源
    最近更新 更多