返回导致错误的通用IList

时间:2014-11-11 11:56:06

标签: c# .net-4.5 ilist contravariance

我有以下结构:

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]'.

我是否错误地投了这个,还是不支持?

1 个答案:

答案 0 :(得分:5)

  

我的印象是,由于逆转,我可以在.Net4.5中这样做,

你的意思是协方差,反过来是相反的,当AB的子类型时,因此X<B>X<A>的子类型(就是这种情况) Action<in T>)。

IList<T>是不变的 - 请注意没有inout修饰符。您可能会将其误认为是IEnumerable<out T>,这是协变的。

为什么它不变,我听到你问? IList<Dog>不能视为IList<Animal>,否则会导致运行时错误:

var listAnimals = listDogs as IList<Animal>();
listAnimals.Add(cat);