C# 为什么可以';将类型对象的t1转换为双精度

C# 为什么可以';将类型对象的t1转换为双精度,c#,listbox,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];

当我想将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();
}
当我更改
list1.Add(1)到<代码>列表1.添加(1.0)它可以工作。为什么它与
1.0
一起工作,而与
1
不一起工作

当我第一次将list1[0]强制转换为int,然后再转换为double时,它的效果太差了。你能告诉我为什么吗?


谢谢

因为如果您键入
1
,那么它将是一个整数值,而不是一个双精度值。整数不能转换为双精度,它只能转换为双精度,这是不同的操作,即使它在代码中看起来相同。因此,如果您希望它使用整数
1
,则必须将其强制转换为
int
,然后转换为
double

(double)(int)liste1[0]
或者使用
Convert.ToDouble
,它可能在内部执行类似的操作:

((IConvertible)liste1[0]).ToDouble();

ArrayList
保存对象。如果添加一个
int
,它将被“装箱”到对象中,并且只能“取消装箱”到
int
-而不是
double


ArrayList索引器返回一个对象。C#不能从一个对象转换为双精度。这一切都与运行时类型转换和装箱有关

这应该起作用:

double num = (double)(int)liste1[0] +(double)liste1[2];
Eric Lippert的优秀博客详细介绍了这一点

简而言之,这是由于C#的cast操作符在不同的上下文中表示不同的事物。最好将int视为具有允许将其转换为double的类型,但如果在编译时不知道该类型是int,则不会运行此操作。毕竟,
object
没有一个能够转换该类型的隐式(或显式)转换操作符,而这正是您想要做的


现在,如果需要,可以在幕后做更多的工作,以确定是否有转换它的方法,但由于这是不寻常的,最好留给一个通用的助手方法,如
Convert.ToDouble(object)

或使用“Convert”:
Convert.ToDouble(list1[0])
True,更优雅的方法是:
double num=Convert.ToDouble(list1[0])+Convert.ToDouble(list1[2])@KooKiz比我早三秒。。很好!:)