今天学引用类型转换的时候,其中有点总是无法理解,以下是我的代码:
class Program
{
    static void Main(string[] args)
    {
       Person[] pers = new Person[4];//定义一个Person类数组
       Chinese ch1 = new Chinese();
       Chinese ch2 = new Chinese();
       Japanese jp1 = new Japanese();
       Japanese jp2 = new Japanese();
       pers[0] = ch1;
       pers[1] = ch2;
       pers[2] = jp1;
       pers[3] = jp2;
       for (int i = 0; i<pers.length;i++)
       {
           if(pers[i] is Chinese)
           {
               Chinese c = pers[i] as Chinese;
               c.SayHello();
            }

            else if (pers[i] is Japanese)
            {
                Japanese j = pers[i] as Japanese;
                j.SayJapanese();
             }
         }
         Console.ReadKey();
      }
  }
  
  class Person
  {
  }
  class Chinese
  {
    public void SayHello()
    {
       Console.WriteLine("你好,我是中国人!");
     }
   }   class Japanese: Person
   {
     public void SayJapanese()
     {
        Console.WriteLine("阿里阿多!");
      } 
    }[/size]由于不知道为何不能粘贴代码,我只好手动写了这些,格式有不清楚的地方请各位见谅。
这里我搞不明白的地方就是我用红色标起的地方,既然已经定义了if(pers[i] is Chinese)为什么还要再对pers[i]进行一次强制转换才能赋值给c?请各位高手帮忙解答一下,谢谢。

解决方案 »

  1.   

    If判断per[i]是否能转换为Chinese类型(当能转换时返回true),如果能转换,就用as操作符进行转换。as操作符不是强制转换,强制转换是在类型前加一个括号,里面写上要强制转换的类型。
      

  2.   

    这个我知道啊,但是既然if已经判断了是否为Chinese类型,比如per[i],为什么还要用as进行转换呢?
      

  3.   

    如果你学过asp.net你会发现清空清空页面所有的 textbox有这句。 foreach( Contarl c in this.Contrals)
    {
      if(c is textbox)
    {
      (c as Textbox).text="";
    }
    }
    这段跟你的意思很像
      

  4.   

    对啊,我就是不理解,前面的if既然已经做了判断了,比如我前面的例子
    if(per[i] is Chinese)
    {Chinese c = per[i] as Chinese; }
    既然if里面已经做了判断,当per[i]是Chinese的时候,进行转换,那不是多此一举了吗?
      

  5.   

    if做了判断只是“你”知道了,但到下一个语句,系统还是要求根据语法进行转换
    你也可以这样:
      Chinese c = pers[i] as Chinese;
      if(c != null)
      {
        c.SayHello();
      }
      else
      {
        Japanese j = pers[i] as Japanese;
        if(j != null)
        {
          j.SayJapanese();
        }
      }
      

  6.   

    事实上,如果你使用FxCop之类的代码检查工具的话,这段代码
      if(pers[i] is Chinese)
      {
      Chinese c = pers[i] as Chinese;
      c.SayHello();
      }
    会产生警告,大概意思是说这么写代码会带来性能问题,因为这里会产生两次类型转换:
    第一次是
      if(pers[i] is Chinese)
    第二次是
      Chinese c = pers[i] as Chinese;
    建议的做法是:
      Chinese c = pers[i] as Chinese;
      if (c != null)
      {
        c.SayHello();
      }