为什么不能将类型对象中的1转换为double

时间:2011-12-13 12:18:35

标签: c# listbox

当我想将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时,它也是。你能告诉我原因吗?

谢谢

4 个答案:

答案 0 :(得分:4)

ArrayList拥有对象。如果您添加int,则会将其“加框”到对象中,并且只能“取消装箱”回int - 而不是double

MSDN: boxing & unboxing

答案 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];