我有以下结构:
public class MyBaseClass : IGeneralClass
{
}
public class MyClass : MyBaseClass
{
...
}
public class MyDataClass
{
private List<MyClass> _data = null;
public void PopulateData()
{
...
}
public IList<IGeneralClass> Data
{
get
{
return (IList<IGeneralClass>)_data;
}
}
}
我的印象是我可以在.Net4.5中因为逆转而这样做,但是当我尝试时,我得到一个运行时错误如下:
Unable to cast object of type 'System.Collections.Generic.List`1[MyClass]' to type 'System.Collections.Generic.IList`1[IGeneralClass]'.
我是否错误地投了这个,还是不支持?
答案 0 :(得分:5)
我的印象是,由于逆转,我可以在.Net4.5中这样做,
你的意思是协方差,反过来是相反的,当A
是B
的子类型时,因此X<B>
是X<A>
的子类型(就是这种情况) Action<in T>
)。
IList<T>
是不变的 - 请注意没有in
或out
修饰符。您可能会将其误认为是IEnumerable<out T>
,这是协变的。
为什么它不变,我听到你问? IList<Dog>
不能视为IList<Animal>
,否则会导致运行时错误:
var listAnimals = listDogs as IList<Animal>();
listAnimals.Add(cat);