具有以下类结构:
class Base {}
class Derived : Base {}
interface Cov<out T> {
}
class Inv<T> : Cov<T> {}
令我惊讶的是,以下演员编译没有错误,但在运行时抛出InvalidCastException
:
Cov<Inv<Base>> v = (Cov<Inv<Base>>)(new Inv<Inv<Derived>>());
协方差显然至关重要,因为用Cov
取代外Inv
如下:
Inv<Inv<Base>> v = (Inv<Inv<Base>>)(new Inv<Inv<Derived>>());
按预期发出编译器错误:
错误CS0030:无法转换类型'ParameterCast.Inv&lt; ParameterCast.Inv&lt; ParameterCast.Derived&gt;&gt;'到'ParameterCast.Inv&lt; ParameterCast.Inv&lt; ParameterCast.Base&gt;&gt;'
为何出现差异?