Cannot implicitly convert type 'int' to 'short'
我编写了以下小程序来打印斐波那契序列:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 | static void Main(string[] args) { Console.Write("Please give a value for n:"); Int16 n = Int16.Parse(Console.ReadLine()); Int16 firstNo = 0; Int16 secondNo = 1; Console.WriteLine(firstNo); Console.WriteLine(secondNo); for (Int16 i = 0; i < n; i++) { //Problem on this line Int16 answer = firstNo + secondNo; Console.WriteLine(answer); firstNo = secondNo; secondNo = answer; } Console.ReadLine(); } |
编译消息是:
Cannot implicitly convert type 'int'
to 'short'. An explicit conversion
exists (are you missing a cast?)
既然所涉及的一切都是一个Int16(简称),那么为什么要进行任何隐式转换呢?更具体地说,为什么这里的失败(而不是最初为变量赋值int时)?
一个解释会很受欢迎的。
Microsoft在执行添加功能时将您的
更改以下内容:
1 | Int16 answer = firstNo + secondNo; |
进入…
1 | Int16 answer = (Int16)(firstNo + secondNo); |
阅读埃里克·利珀特对这些问题的回答
- 整数和蓝色,短+=短问题
- 一元减号变为一个整型?
添加两个
1 | Int16 answer = (Int16) (firstNo + secondNo); |
您可以通过将所有号码切换到
问题是,正如其他人已经指出的那样,添加两个
1 short x = 32767;In the preceding declaration, the integer literal 32767 is implicitly converted from int to short. If the integer literal does not fit into a short storage location, a compilation error will occur.
所以,在您的声明中,它起作用的原因很简单,就是我们知道所提供的文字适合
加号运算符首先将操作数转换为int,然后进行加法。所以结果是int。您需要显式地将其转换回short,因为从"longer"类型到"shorter"类型A的转换是显式的,这样您就不会意外地使用隐式转换释放数据。
至于为什么int16被强制转换为int,答案是,因为这是C规范中定义的,而C是这样的,因为它被设计成与clr的工作方式紧密匹配,clr只有32/64位算术而不是16位。在clr之上的其他语言可能选择以不同的方式公开这一点。
出于一些奇怪的原因,您可以使用+=运算符添加短裤。
1 2 3 4 5 6 | short answer = 0; short firstNo = 1; short secondNo = 2; answer += firstNo; answer += secondNo; |
两个
1 2 3 4 | Int16 i1 = 1; Int16 i2 = 2; var result = i1 + i2; Console.WriteLine(result.GetType().Name); |
输出
线
1 | Int16 answer = firstNo + secondNo; |
被解释为
1 | Int16 answer = (Int32) (firstNo + secondNo); |
只是因为没有Int16算术。
简单的解决方案:不要使用int16。使用Int32或简单地使用
这是因为添加两个