派生列表以建立基本 IEnumerable



我有以下代码在.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.所有 这些接口的类型参数是协变的,因此类型 参数仅用于成员的返回类型。

最新更新