从List <T>到IEnumerable <T>的InvalidCastException仅在3.5中

Dar*_*xel 4 .net c# casting exception

如果我打电话给那个

var list = new List<Class1>();
Test((IEnumerable<Interface1>)list);
Run Code Online (Sandbox Code Playgroud)

public interface Interface1
{

}

public static void Test(IEnumerable<Interface1> test)
{

}

public class Class1 : Interface1
{

}
Run Code Online (Sandbox Code Playgroud)

我得到了一个带有3.5框架的InvalidCastException,但在4和4.5中它没问题.我不明白为什么,都有IEnumerable

如果我检查3.5和4.5中的列表,我看不出为什么我得到InvalidCastException

4.5:

public class List<T> : IList<T>, ICollection<T>, 
    IEnumerable<T>, IEnumerable, IList, ICollection, IReadOnlyList<T>, IReadOnlyCollection<T>
Run Code Online (Sandbox Code Playgroud)

3.5:

public class List<T> : IList<T>, ICollection<T>, 
    IEnumerable<T>, IList, ICollection, IEnumerable
Run Code Online (Sandbox Code Playgroud)

Dav*_*d L 5

在3.5中,IEnumerable<T>界面不协变.这是在4.0中添加的.

需要协方差来转换为更加派生的类型,这就是这里的情况(List<T>implements IEnumerable<T>).

MSDN