为什么我可以传递1作为一个简短的,而不是我的intvariables?

为什么第一个和第二个写入工作,但不是最后一个? 有没有办法,我可以允许所有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!? } } 

前两个是常量expression式,最后一个不是。

C#规范允许int的隐式转换为常量的缩写,但不允许其他expression式。 这是一个合理的规则,因为对于常量,编译器可以确保该值符合目标types,但不能用于正常expression式。

这个规则符合隐式转换应该是无损的指导原则。

6.1.8隐式常量expression式转换

隐式常量expression式转换允许进行以下转换:

  • 如果常量expression式的值在目标types的范围内,则可以将inttypes的常量expression式 (第7.18节)转换为sbytebyteshortushortuintulongtypes。
  • longtypes的常量expression式可以转换为ulongtypes,前提是常量expression式的值不是负数。

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

由于可能的截断, int没有隐式的转换。 但是, 常量expression式可以被编译器视为目标types。

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

一个int 文字可以隐式转换为short 。 鉴于:

您不能隐式地将较大存储大小的非文字数字types转换为简写

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

我相信这是因为你在前两个字符/常量传入,但是在第三个传入一个整数时没有自动types转换。

编辑:有人打败了我!

因为Nonliteraltypes与更大的shorttypes之间不会有任何隐式的转换。

隐式转换只能用于常量expression式。

 public static void Write(short v) { } 

当你正在将integer数值作为parameter passing给short

 int i=1; Write(i); //Which is Nonliteral here 

编译器告诉你为什么代码失败:

 cannot convert `int' expression to type `short' 

所以这里是你应该问的问题:为什么这个转换失败? 我GOOGLE了“C#转换诠释短”,最后在MS C#页面的short关键字:

http://msdn.microsoft.com/en-us/library/ybs77ex4(v=vs.71).aspx

正如这个页面所说的,从较大的数据types到隐式的转换只允许使用文字。 编译器可以知道文字何时超出范围,但不是这样,所以需要确保您避免了程序逻辑中的超出范围的错误。 这个保证是由演员提供的。

 Write((short)i) 

从int – > short转换可能会导致数据截断。 这就是为什么。