C# 为什么类型参数的变化会影响捕获其嵌套类型参数的非法强制转换的时间?

C# 为什么类型参数的变化会影响捕获其嵌套类型参数的非法强制转换的时间?,c#,casting,runtime-error,covariance,C#,Casting,Runtime Error,Covariance,具有以下类结构: class Base {} class Derived : Base {} interface Cov<out T> { } class Inv<T> : Cov<T> {} 协方差显然至关重要,因为将外部Cov替换为Inv,因此: Inv<Inv<Base>> v = (Inv<Inv<Base>>)(new Inv<Inv<Derived>>()); Inv v=

具有以下类结构:

class Base {}
class Derived : Base {}
interface Cov<out T> {
}
class Inv<T> : Cov<T> {}
协方差显然至关重要,因为将外部
Cov
替换为
Inv
,因此:

Inv<Inv<Base>> v = (Inv<Inv<Base>>)(new Inv<Inv<Derived>>());
Inv v=(Inv)(新Inv());
按预期发出编译器错误:

错误CS0030:无法将类型“ParameterCast.Inv”转换为“ParameterCast.Inv”


为什么会有差异?

理论上,编译器只知道type
Inv
是一个上限。你知道,事实上是那种类型。可能有一个子类
Int
实现接口
Cov
,在这种情况下,转换在运行时成功。在另一种情况下,它知道具体类型
Int
永远不可能是具体类型
Int
的上限。不是差异,而是类型是否是影响结果的接口。@mikez我现在明白了,将
Cov
更改为类会导致编译时错误。如果
Inv
实现了
Cov
,我也能理解cast的成功,但既然在这种情况下没有,编译器还不知道什么?对于Tu,实现
Cov
Inv
子类如何存在≠电视?就我所知,难道没有任何
Cov
方法会被复制成不同的类型吗?
Inv<Inv<Base>> v = (Inv<Inv<Base>>)(new Inv<Inv<Derived>>());