我有以下代码在.NET Framework 4.0及更高版本中编译:
public abstract class MyBase { }
public class MyDerived : MyBase { }
public abstract class MyBaseCollection<T> : IList<T> where T : MyBase
{
protected readonly IList<T> deriveds = new List<T>();
public void Test()
{
// This line works in .NET versions 4.0 and above, but not in versions below.
IEnumerable<MyBase> bases = deriveds;
}
#region IList members with NotImplementedException
// ...
#endregion
}
public class MyDerivedCollection : MyBaseCollection<MyDerived> { }
但是在低于4.0的.NET Framework中,我在以下行收到编译错误:
IEnumerable<MyBase> bases = deriveds;
无法将类型"System.Collections.Generic.IList
"隐式转换为"System.Collections.Generic.IEnumerable"。存在显式转换(您是否缺少强制转换?
问题是 .NET 4.0 中对此进行了哪些更改(或引入了(?
有关于此的文档吗?
在 .Net 4.0 中,IEnumerable<T>
接口从:
public interface IEnumerable<T>
自
public interface IEnumerable<out T>
请注意,单词 out 已添加到泛型类型参数中。这意味着泛型参数是协变的,这意味着您可以传入更派生的类型。
协方差 使您能够使用比原来派生的类型更多的类型 指定。您可以分配 IEnumerable 的实例 (Visual Basic 中的 IEnumerable(Of Derived((到类型的变量 IEnumerable
有关详细信息,请参阅 msdn
这是关于集合的协方差和逆变。查看以下链接以获取更多信息。
从 .NET Framework 4 开始,几个通用接口具有 协变类型参数;例如:IEnumerable, IEnumerator, IQueryable 和 IGrouping.所有 这些接口的类型参数是协变的,因此类型 参数仅用于成员的返回类型。