http://www.cnblogs.com/Ninputer/archive/2008/11/22/generic_covariant.html
本文将不会阐述基本概念,请参考其它相关资料。
1、 Interface的功能如此强大,如此的富有意义,值类型当然不会拒绝它。一个值类型可以实现一个或者多个接口。值类型有2种表现形式:未装箱(unboxed)和已装箱(boxed)
2、虽然未装箱的值类型没有类型对象指针,但仍然可以调用由类型继承或者重写的虚方法(如:Equals,GetHashCode,ToString).如果你的值类型重写了其中任意一个虚方法,那么CLR可以非虚地调用该方法。因为值类型是密封的,没有任何类型能够从它们派生。此外,用于调用虚方法的值类型示例也不会被装箱。然而,如果你重写的虚方法要调用的方法在基类中实现,那么在调用基类的实现时,值类型实例就会装箱,以便通过this指针将一个堆对象的引用传给基方法。
3、调用一个非虚,继承的方法时候(),无论如何都要对值类型进行装箱操作。这是因为这些方法是有System.Object定义的,所以这些方法期望this指针实参是指向堆上的一个对象的指针。
4、将值类型的一个未装箱的实例转型为类型的某个接口,要求对实例进行装箱。这是因为接口变量必须包含对堆上的一个对象的引用。接口变量指向堆上的一个对象的引用,以使在CLR能检查对象的类型对象指针判断对象的确切类型。
5、值类型是不可变的、使用接口更改已装箱值类型中的字段
第一次看到这样的语句,我不知道到底这是什么意思。
PS:
学习东西最可怕的不是你记住的知识少,而是你记住的都是错误的!切身体会......
通常为了调用一个虚方法,CLR 需要判断对象的类型,以定位类型的方法表。