本帖最后由 yemaozi1982 于 2011-06-04 12:29:14 编辑

解决方案 »

  1.   

    lz什么意思,a后来不是指向了一个新的Num对象么?x是默认值,y还没有显示赋值,默认0
      

  2.   


     a = Oper.Set();//主要原因是这句
    通过 Num temp = new Add1();你new了一个Add1类的对象,在new的过程中会调用它的基类[Num]的构造函数【虽然你没显示的调用,但是编译器会为你生成这部分代码,可以用ildasm看下IL代码,Reflector也可以】
    所以这是一个全新的对象,和你之前new的Num没有任何关系,a只是一个引用,现在你让a指向了新的对象,而这个新的对象只在构造的时候执行了默认的初始化,所以x=2,y=0了
      

  3.   

    Num a = new Num();              // 这是new的第一个Num类型对象,这是a的第一次赋值
    Console.WriteLine(a.x);
    a.y = 30;
    Console.WriteLine(a.y);a = Oper.Set();               // 这里又new了一个Num的派生对象Add1,并返回给a,这是a的第二次赋值
    Console.WriteLine(a.x);
    Console.WriteLine(a.y);简言之,前后两次,a指向了2个不同的对象