Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/71.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 无隐式int->;三元语句中的短转换_C#_Ternary Operator_Implicit Conversion - Fatal编程技术网

C# 无隐式int->;三元语句中的短转换

C# 无隐式int->;三元语句中的短转换,c#,ternary-operator,implicit-conversion,C#,Ternary Operator,Implicit Conversion,这在以下情况下失败: 错误CS0266:无法隐式执行 将类型“int”转换为“short”。一 存在显式转换(是否存在 缺少演员阵容?) 有人能解释为什么会这样吗?我能想到的唯一一件事是编译器不看第二个值,也不知道两者之间的范围,比如我写了 short s; s = (EitherTrueOrFalse()) ? 0 : 1; 对吗? 唯一的解决办法是用丑陋的演员 此外,C#似乎没有短类型的类型后缀。这是一个相当严重的疏忽。否则,这将是一个解决方案…编译器有一个从常量表达式到各种基本类型的隐式

这在以下情况下失败:

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

有人能解释为什么会这样吗?我能想到的唯一一件事是编译器不看第二个值,也不知道两者之间的范围,比如我写了

short s;
s = (EitherTrueOrFalse()) ? 0 : 1;
对吗? 唯一的解决办法是用丑陋的演员


此外,C#似乎没有短类型的类型后缀。这是一个相当严重的疏忽。否则,这将是一个解决方案…

编译器有一个从常量表达式到各种基本类型的隐式转换(只要值在适当的范围内),但这里的表达式不是常量-它只是一个int表达式。这与:

short s;
s = (EitherTrueOrFalse()) ? 0 : 65000;
就编译器而言

有两个选项—可以强制转换整个表达式,也可以强制转换后两个操作数中的每一个:

short s;
s = CallSomeMethodReturningInt32();
使整个表达式类型
简短
。在这种特殊情况下,遗憾的是没有一个数字文字后缀来显式声明
short
literal。显然,语言设计者确实考虑过这一点,但觉得这是一种相对罕见的情况。(我想我可能会同意。)

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

6.1.8隐式常量表达式转换

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

  • 类型的常量表达式(§7.18)
    int
    可转换为sbyte类型,
    byte
    short
    ushort
    uint
    ,或
    ulong
    , 提供了 常量表达式在 目标类型的范围
  • A
    long
    can类型的常量表达式 转换为类型
    ulong
    ,提供 常量表达式的值 这不是消极的

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

short s = (EitherTrueOrFalse()) ? (short) 0 : (short) 1;
我的意思是,这就是用C#写的方式,即使它看起来很难看

看这个。
关于这个问题,请参见。

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

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

也就是说,每当short用于某个东西时,它就会被提升为int。

你是对的,short类型没有类型后缀。short类型没有类型后缀,但我很难称之为“严重疏忽”。不知何故,我们.net开发人员设法解决了这一令人发指的缺陷……嗯,出于某种原因,VB拥有它……条件运算符中的int/short常量转换实际上导致了一些有趣的语言设计问题。如果你对这个话题感兴趣,苏不,那不是原因。它不是“当short用于某物时”。特别是,如果0和1实际上是s1和s2,则可以。在您的例子中,加法失败的原因是没有定义加法运算符,因此值被提升为int。或者,如果您愿意,我不建议强制转换整个表达式,因为这将在运行时执行,而常量的强制转换由编译器执行。您的解释很有意义。是的,这是我第一次遇到它,所以认为它稀有或稀有可能是正确的。不过,遗憾的是没有后缀。
short s1 = GetShort1();
short s2 = GetShort2();
short s3 = s1 + s2;