返回导致错误的通用IList

Pau*_*els 1 c# ilist contravariance .net-4.5

我有以下结构:

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;
        }
    }

}
Run Code Online (Sandbox Code Playgroud)

我的印象是我可以在.Net4.5中做这个因为逆转,但是当我尝试时,我得到一个运行时错误,如下所示:

Unable to cast object of type 'System.Collections.Generic.List`1[MyClass]' to type 'System.Collections.Generic.IList`1[IGeneralClass]'.
Run Code Online (Sandbox Code Playgroud)

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

dca*_*tro 5

我的印象是我可以在.Net4.5中做这件事因为逆转,

你的意思是协方差,反方差是另一种方式,什么时候A是子类型B,因此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);
Run Code Online (Sandbox Code Playgroud)