为什么我可以将1作为短路,而不是int变量i?

147 c# int compiler-errors type-conversion implicit-conversion

为什么第一个和第二个写入工作但不是最后一个?有没有办法我可以允许所有3个并检测它是1,(int)1还是我传入?真的为什么一个允许但最后一个?第二个被允许但不是最后一个真的让我大吃一惊.

演示显示编译错误

using System;
class Program
{
    public static void Write(short v) { }
    static void Main(string[] args)
    {
        Write(1);//ok
        Write((int)1);//ok
        int i=1;
        Write(i);//error!?
    }
}
Run Code Online (Sandbox Code Playgroud)

Cod*_*aos 186

前两个是常量表达式,最后一个不是.

C#规范允许从int到short的隐式转换,但不能用于其他表达式.这是一个合理的规则,因为对于常量,编译器可以确保该值适合目标类型,但它不能用于正常表达式.

此规则符合隐式转换应无损的准则.

6.1.8隐式常量表达式转换

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

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

(引自C#语言规范版本3.0)

  • 这是否意味着`写((短)i);`会起作用吗? (6认同)
  • 是这样的明确演员应该有效 (5认同)

Kon*_*lph 67

没有来自隐式转换intshort的,因为截断的可能性.但是,常量表达式可以被编译器视为目标类型.

1?不是问题:它显然是一个有效的short价值.i?没有那么多 - short.MaxValue例如,它可能是一些值,并且编译器在一般情况下无法检查它.

  • @ acidzombie24在运行时期间无法传入文字.所以你可以在编译时用眼睛检查. (3认同)

Dam*_*ver 8

int 字面可以隐式转换到short.鉴于:

您不能隐式地将较大存储大小的非平面数字类型转换为short

所以,前两个工作是因为允许文字的隐式转换.

  • 你的答案有点不对劲.你不应该使用*literal*而是*constant-expression*.特别是第二个例子不是*literal*. (3认同)

Jus*_*tin 6

我相信这是因为你在前两个传递了一个文字/常量,但是在传递第三个中的整数时没有自动类型转换.

编辑:有人打败了我!