栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

协方差和IList

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

协方差和IList

更新:从.NET 4.5开始

IReadOnlyList<out T>
IReadOnlyCollection<outT>
这两者都是协变的;后者基本上是
IEnumerable<outT>
加号
Count
; 前者补充说
T this[int index] {get;}
。还应注意,
IEnumerable<out T>
从.NET
4.0开始是协变的。

双方

List<T>
ReadOnlyCollection<T>
(通过
List<T>.AsReadonly()
)实现这两个。


如果只有

get
索引器,则只能是协变的,即

public T this[int index] { get; }

但是所有主要收藏都有

{get;set;}
,这很尴尬。我不知道有什么可以满足要求的,但是您可以 包装 起来,即编写一个扩展方法:

var covariant = list.AsCovariant();

这是一个包装器

IList<T>
,仅暴露
IEnumerable<T>
和和
get
索引器…?应该只有几分钟的工作…

public static class Covariance{    public static IIndexedEnumerable<T> AsCovariant<T>(this IList<T> tail)    {        return new CovariantList<T>(tail);    }    private class CovariantList<T> : IIndexedEnumerable<T>    {        private readonly IList<T> tail;        public CovariantList(IList<T> tail)        { this.tail = tail;        }        public T this[int index] { get { return tail[index]; } }        public IEnumerator<T> GetEnumerator() { return tail.GetEnumerator();}        IEnumerator IEnumerable.GetEnumerator() { return tail.GetEnumerator(); }        public int Count { get { return tail.Count; } }    }}public interface IIndexedEnumerable<out T> : IEnumerable<T>{    T this[int index] { get; }    int Count { get; }}


转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/514738.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号