public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
            Line_List = new ArrayList();
        }        private void Form1_Load(object sender, EventArgs e)
        {        }
        private bool  = false;//表示鼠标左键是否按下,如按下鼠标再移动将画曲线
        private Point point;//记录画下一很短线段的起始点。
        private ArrayList Point_List;//用来记录1条曲线的所有点。
        private ArrayList Line_List;//用来记录每条曲线,既Point_List对象。
      
     
        private void Form1_MouseDown_1(object sender, MouseEventArgs e)
        {
            if (e.Button == MouseButtons.Left)
            {
                Point_List = new ArrayList();//建立数组,记录1条曲线的所有点
                point.X = e.X;
                point.Y = e.Y;
                 = true;
                Point_List.Add(point);//曲线起点的坐标
            }
        }        private void Form1_MouseMove_1(object sender, MouseEventArgs e)
        {
            if ()
            {
                Graphics g = this.CreateGraphics();
                Pen pen1 = new Pen(Color.Black);
                g.DrawLine(pen1, point.X, point.Y, e.X, e.Y);
                point.X = e.X;
                point.Y = e.Y;
                Point_List.Add(point);//记录曲线中其它点的坐标
            }
        }        private void Form1_MouseUp_1(object sender, MouseEventArgs e)
        {             = false;
            Line_List.Add(Point_List);//记录此条线,注意参数是Point_List
        }
        private void Form1_Paint_1(object sender, PaintEventArgs e)
        {
            Graphics g = e.Graphics;
            Pen pen1 = new Pen(Color.Black);
            Point p1, p2;
            foreach (ArrayList l in Line_List)//取出每条线
            {                for (int k = 0; k < (l.Count - 1); k++)//重画每条线的点
                {
                    p1 = (Point)l[k];
                    p2 = (Point)l[k + 1];

                    g.DrawLine(pen1, p1, p2);
                }
            }
        }    }问题:各位,虽然代码有点长,不过,我还是全部写下来了,不懂的问题,就是红色字体的代码
ArrayList类型的变量 l怎么能强制转换成Pint类型的呢?没有什么依据吗?还是想转换成什么类型,就转换成什么类型? 

解决方案 »

  1.   

    没看代码,直接看的问题。ArrayList存的是object类型,如果你当初把arraylist里add的是pint类型的话,使用的时候当然可以直接转成pint对象来用
      

  2.   

    写代码时可以想转什么转什么,但是到了运行时,如果转换不成功,会抛出异常
    所以不要再使用ArrayList了,类型不安全,使用泛型集合吧
      

  3.   

    因为Point_List中保存的都是point类型啊,所以通过索引访问的就是point类型数据
      

  4.   

    存的就是Point...弱类型的集合的缺点之一,可读性极差...如果不是还在用.NET 1.x,不要再用ArrayList了...
      

  5.   

    ArrayList中的变量可以转换为Point类型,其实没有什么依据,唯一的依据就是楼主你知道代码执行到这个地方的时候,ArrayList里是Point类型而不是其它类型。如果连你都不知道ArrayList里面会是什么类型,那就很可能会出错了。
    从.net 2.0开始就已经抛弃ArrayList了,那东西不太靠谱,建议改成List泛型类吧,List<Point>
      

  6.   

     p1 = (Point)l[k];这不是吧ArrayList转换成Pointl[k]调用了ArrayList的索引器,返回这个集合中的第k项,返回类型是object所以(Point)l[k];是把object转换为Point而这个object实际上就是个Point。
    所以转换是合理的
      

  7.   

    (Point)l[k]不是把l转化成Point,而是把l[k]转化成Point.
      

  8.   

    Object o=...;                     //...可以是各种类型
    Point p= (Point)o;          //如果...跟Point类型兼容,你的例子中...就是Point类型显然兼容,或者...是Point的派生类的实例也是兼容的,(ps:你这里Point是值类型不可能有派生类),如果不兼容会发生运行时异常打一个不当的比喻
    语句第一句 把一个水果放到包裹里面,包裹上写上水果
    第二句 把包裹拆开,把里面的东西取出来当做水果(吃了)如果把炸弹打包写上水果,打开吃的时候会异常