窗口里有一个panel1
第一段代码:
private void button1_Click(object sender, EventArgs e)
        {
            Panel panel;     //声明一个Panel类型的变量
            panel = panel1;    //panel等于panel1
            foreach (Control c in panel.Controls)    //没报错
            {             }          
            
        }
第二段代码:
private void button1_Click(object sender, EventArgs e)
        {
            Panel panel;    //声明一个Panel类型的变量            
            foreach (Control c in this.Controls)    //遍历到窗口中的panel1
            {
                if (c is Panel)
                {
                    panel = c as Panel;
                }
            }
            foreach (Control c in panel.Controls)  //报错:使用了未赋值的局部变量panel
            { 
             
             }         
            
        }我想问,两段代码,都差不多,为什么第二段代码要报错:使用了未赋值的局部变量panel...我不是已经赋值了吗?
 panel = c as Panel;

解决方案 »

  1.   

    这个问题出在.net(确切的说是VS)的类型检查上面
    你第二段代码Panel panel; //声明一个Panel类型的变量
    只是声明有这么个panel,但是没有给他显示赋值
    所以语法检查认为这个地方"Use of unassigned local variable 'panel'"其实代码逻辑上是没问题的
    改成Panel panel = null; //声明一个Panel类型的变量就能通过编译了
      

  2.   

    显示赋上值
    Panel panel = null;
      

  3.   

    补充一句,你的显式赋值被包在if块里了
    按照规矩
    因为if里面的东西有可能执行,也有可能不执行,所以不能算显式赋值
      

  4.   

    但是,第一段代码,为什么又无需写:
    显示赋上值
    Panel panel = null;呢?
      

  5.   


    给声明的panel赋上一个初始值
      

  6.   

    那比如这个例子: 
                List<int> lis =null;  //我赋了初始值
                lis.Add(0);  //报错,未将对象引用到实例 
                lis.Add(1);
                lis.Add(3);
                lis.Add(6);
    我赋值了,为什么要报错呢?
      

  7.   


    你还没实例化呢
    lis=new List<int>();上例有panel = c as Panel你比较一下
      

  8.   

    试试把Panel panel改成Panel panel = null;
      

  9.   


    那该怎么写呢?
    List<int> lis = new List<int>();  //添一句吗?
     List<int> lis =null;   //再赋初始值
      lis.Add(0); 
      lis.Add(1);
      lis.Add(3);
      lis.Add(6);是不是添一句new语句,然后赋初始值?感觉很别扭...
      

  10.   


    List<int> lis=new List<int>();也可以
     List<int> lis =null;
    lis=new List<int>();兄弟,学得有点机械化了
      

  11.   


    new一下,就是在内存开一片空间,就可以往里加数据了
      

  12.   

    private Panel GetPanel(Control parent)
    {
    foreach(Control ctr in parent.Controls)
    {
    if(ctr is Panel)
    {
    return ctr as Panel;
    }
    Panel pnl = GetPanel(ctr);
    if(pnl != null)
    {
    return pnl;
    }}
    return null;
    }private void button1_Click(object sender, EventArgs e)
      {
      Panel panel; //声明一个Panel类型的变量
    panel= GetPanel(this);   
     if(panel != null)
    {
      foreach (Control c in panel.Controls) //报错:使用了未赋值的局部变量panel
      {  
        
      }   
        
      }}