首页 >后端开发 >C++ >如何通过 .NET 集合中的索引访问实现协变行为?

如何通过 .NET 集合中的索引访问实现协变行为?

Barbara Streisand
Barbara Streisand原创
2024-12-30 10:43:10368浏览

How Can I Achieve Covariant Behavior with Indexed Access in .NET Collections?

理解协方差和 IList 限制

协方差是编程中的一个原则,其中引用类型可以分配给基类或接口的变量类型。然而,当涉及到集合时,特别是当我们考虑 IList 接口时,这会带来一个困境。

IList 表示具有索引访问的集合,允许我们通过索引检索元素。不幸的是,像 List 这样的内置 .NET 集合无法实现。同时实现 get 和 set 索引器,这会阻止它们完全协变。

具有索引访问的协变集合的解决方案

尽管存在此限制,但仍有一些方法可以实现协变行为,同时保持索引访问。

1. ReadOnlyCollections(从 .NET 4.5 开始)

IReadOnlyList;和 IReadOnlyCollection是 .NET 4.5 中引入的协变接口。它们只有一个 get 索引器,这使得它们适合协变场景。列表和 ReadOnlyCollection实现这两个接口。

2.自定义包装器

如果您需要在早期版本的 .NET 中具有索引访问的协变集合,您可以创建一个包装器类。包装类将封装 IList 。并且仅公开 get 索引器和 IEnumerable

以下代码演示了一个名为 CovariantList 的自定义包装类。提供对 IList 的协变访问:

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

以上是如何通过 .NET 集合中的索引访问实现协变行为?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn