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

这个失败:

错误CS0266:无法隐含地 转型'int'为'短期'.一个 明确的转换存在(你 缺少一个铸的?)

任何人都可以解释为什么会这样?我唯一能想到的是那个编译器不看看第二个值并不知道之间的范围的两个,在这种情况下我写的东西喜欢

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

正确的吗?唯一的解决方法是与一个丑陋的铸的?

此外,它似乎C#没有一种类型的后缀短的类型。这是一个非常严重的监督海事组织。否则,这已经是一个解决方案...

有帮助吗?

解决方案

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

short s;
s = CallSomeMethodReturningInt32();

就编译器而言。

有两个选项 - 您可以强制转换整个表达式,或强制转换后两个操作数:

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

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

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

6.1.8 隐式常量表达式转换

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

  • A 常量表达式 (§7.18) 类型 int 可以转换为sbyte类型, byte, short, ushort, uint, , 或者 ulong, 提供的值 常量表达式 在 目标类型的范围。
  • A 常量表达式 类型的 long 能 转换为类型 ulong, 提供 的值 常量表达式不是负数。

其他提示

因为 铸是通过编译器, 不是在运行时,我不会称它的一个丑陋的铸造的,我会说它是一个复杂的语法:

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

我的意思是,这是它的方式是编写,即使它看起来丑陋。

看看这个 博文.看看 Marc Gravell的答案 在这个问题。

我想这具有相同的原因,因为这将不编译:

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

即。每当短用于东西,它被提升到中间体

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top