class Program
{
static void Main(string[] args)
{
try
{ B b = new B(); }
catch(Exception ex)
{Console.WriteLine(ex.GetType().ToString()); }
Console.Read();
}
class A
{ protected Ref my;
public A()
{ my = new Ref();
Console.Write(ToString()); }
public override string ToString()
{ return my.ToString(); }
}
class B : A
{ private Ref my2;
public B() : base()
{ my2 = new Ref();}
public override string ToString()
{return my2.ToString();}
}
//一个对象引用
class Ref
{ public string s = "我是一个对象";}
}
运行以上代码会出现异常,原因很简单,类A是其他类的基础类,但是在类A的构造函数中调用了虚方法ToString(),导致程序出错。原因是在执行new B(); 时的执行顺序是首先初始化自己的保护变量my然后调用基类的构造函数A(),最后再执行自己的构造函数B(),问题处在调用基类构造函数A()的时候整个对象类型任然保持了真是的类型B,CLR执行类型A的虚方法ToString()的时候会去找它自身的虚方法,就是类型B的ToString()方法,但是此时B的构造过程还没有结束它是不可能调用到这个ToString()虚方法的,对于未构造成员的访问将会产生异常。
避免这种异常的方法是在将会被集成的类的构造函数中永远不要使用虚方法。