当我想将1转换为双倍时,它不起作用。当我将1.0转换为双倍时它起作用。为什么?
我有以下代码:
static void Main(string[] args)
{
ArrayList liste1 = new ArrayList();
liste1.Add(1);
liste1.Add("Hallo");
liste1.Add(2.5);
double num = (double)liste1[0] + (double)liste1[2];
Console.WriteLine(num);
Console.ReadLine();
}
当我将liste1.Add(1);
更改为liste1.Add(1.0);
时,它有效。为什么它适用于1.0
而不适用于1
?
当我第一次将liste1 [0]转换为int,然后转换为double时,它也是。你能告诉我原因吗?
谢谢
答案 0 :(得分:4)
ArrayList
拥有对象。如果您添加int
,则会将其“加框”到对象中,并且只能“取消装箱”回int
- 而不是double
。
答案 1 :(得分:1)
因为如果输入1
,那么它将是一个整数值,而不是一个双精度值。整数不能强制转换加倍,它只能转换加倍,这是不同的操作,即使它在代码中看起来相同。因此,如果您希望它使用整数1
,则必须将其强制转换为int
,然后转换为double
:
(double)(int)liste1[0]
或者使用Convert.ToDouble
可能会在里面做类似的事情:
((IConvertible)liste1[0]).ToDouble();
答案 2 :(得分:1)
Eric Lippert的优秀博客详细介绍here。
简而言之,由于C#的演员操作符在不同的上下文中意味着不同的东西。最好将int视为有一个implicit conversion operator允许转换加倍,但是如果在编译时类型不是一个整数,这不会被运行。毕竟,object
不具有能够转换该类型的隐式(或显式)转换运算符,以及您似乎正在尝试做的事情。< / p>
现在如果需要,可以在幕后进行更多的工作,以确定是否有转换它的方法,但由于这是非常重要的,因此最好留给像Convert.ToDouble(object)
这样的多功能辅助方法。
答案 3 :(得分:0)
ArrayList索引器返回一个对象。 C#无法从对象转换为double。它与运行时类型转换和装箱有关。
这应该有效:
double num = (double)(int)liste1[0] +(double)liste1[2];