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