为什么我可以传递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的范围内,则可以将
int
types的常量expression式 (第7.18节)转换为sbyte
,byte
,short
,ushort
,uint
或ulong
types。long
types的常量expression式可以转换为ulong
types,前提是常量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转换可能会导致数据截断。 这就是为什么。