using System;
using System.Collections;
class aa
{
    public static void Main()
    {
        ArrayList al = new ArrayList(20);
        al.Add(5);
        al.Add("%");
        al.Add(5.0);        int s = (double)(al[0]);   //运行不过去
        //int s = (int)(al[0]);   //运行OK
        Console.WriteLine(s);
        Console.Read();
    }
}它是怎么拆箱装箱,  装进去的时候是int 类型,拆出来不可以直接转化为double类型的吗?

解决方案 »

  1.   

    你这不是运行不过去,是会编译不过去
    int s = (double)(a1[0]);
    不是拆箱装箱的问题,你把一个double型变量直接赋值给int 是不行的
    隐式转换跟强制转换的概念你如果要换成double是这样写的
    double s = (double)(a1[0]);
      

  2.   

    int s = (double)(al[0]);   //运行不过去
    不错 你还知道运行不过去呢
      

  3.   

    呵呵  我原先也发过这样的疑问
    拆箱操作则将引用类型的“还原”到栈上,拆箱首先将引用对象转换成其对应的类型(这里是Int)。也就是此时你只能将这个引用型的对象拆箱到一个和Int兼容的数据类型上,如果你想将其拆箱到其他的数据类型时将会出现类型转换的异常。
      

  4.   

    int s = (double)(al[0]);   //运行不过去
    数据类型不一致
      

  5.   

    ArrayList al = new ArrayList(20);
    al.Add(5);
    al.Add("%");
    al.Add(5.0);double s = (double)(int)(al[0]);
    Console.WriteLine(s);
      

  6.   

    或者ArrayList al = new ArrayList(20);
    al.Add(5);
    al.Add("%");
    al.Add(5.0);int s = (int)(double)(int)(al[0]);
    Console.WriteLine(s);不是什么“大的进小的不可以”,他只是外表大而实质小。
      

  7.   

    那个地方的强转没有问题啊,但是你一个double值赋给了int型的变量
      

  8.   

    要换成double是这样写的
    double s = (double)(a1[0]);
      

  9.   

    自动转换有一个原则,就是,低容量的数,向大容量的数转,低精度的数向大精度的数转,而double是大数,不能自动转换为小的数,因编译不过去,除非这样int s = (int)((double)a[0]);
    所以,你还不如这样
    int s = (int)a[0];