static void Main(string[] args) 
        { 
            A a = new A(); 
            B b =new  B(); 
            b.a = 300; 
            b.b = 20; 
            B e = a.Clone() as B;//这里会运行错误 但是变成b.clone() as B 就会正常 
            System.Console.WriteLine(e.a); 
        } 
这段代码代码的分析很简单:
a.Clone()得到的仍然是一个A类型的对象。A是基类,所以基类是无法强制转换成派生类的。
b.Clone()得到的就B类型的对象了。所以可以AS B。给你一个例子:
A a = new A();
B b = new B();
A a2 = b;   //这是可以的。
B b2 = a2 as B;  //这种强制转换也是可以成功的。

解决方案 »

  1.   

    B c= base.Clone() as B;//为什么这里可以把基类变成派生类????????? 
    这是因为你实例化的对象本身就是B,B相当包含A存在.所以可以转B e = a.Clone() as B;//这里会运行错误 但是变成b.clone() as B 就会正常 
    你实例化是二个对象,而父类中没有关于子类的对象相关的内存,无法转
      

  2.   

    这很简单。变量a不论你声明为什么类型,它指向一个A类对象。变量b不论你声明什么类型,它指向一个B类对象。不是说“可以把基类变成派生类”这种把类型类型和对象本身混淆起来,而是对象b既“是”A类对象也“是”B类对象,也就是说
       if(b is A && b is B)
          return true;
    你可以试试看,这返回true。抛砖引玉吧,你可以借此看出自己对面向对象的理解是否基础牢固。
      

  3.   

    你是被clone搞混了
    从派生类转化成基类可以
    才基类转化成派生类就不行了
      

  4.   

    我是clone搞不懂,为什么 public override object Clone() 
            { 
                B c= base.Clone() as B;//为什么这里可以把基类变成派生类????????? 
                c.b = 100; 
                return c; 
            } 
    而A a = new A(); 
                B b =new  B(); 
                b.a = 300; 
                b.b = 20; 
                B e = a.Clone() as B;//这里会不行 
    都是调用clone返回的都是object为什么base.clone就可以转换成派生类
      

  5.   

    呵呵,给你个答案吧,因为
    MemberwiseClone(); 
    是一个虚函数,这个函数返回的是当前对象的类型。也就是说:MemberwiseClone()在这里实际返回的是B类型的对象,而不是A类型。
    你调用base.Clone()时,实际调用的是 A.Clone(),而A.Clone()调用了MemberwiseClone(); 这一下是不是好理解了?如果改一下,把
    A.Clone()
    {
       A r = new A();
       r.a = this.a;
       return r;
    }
    你的B.Clone()肯定会报错。