"Si un trabajador quiere hacer bien su trabajo, primero debe afilar sus herramientas." - Confucio, "Las Analectas de Confucio. Lu Linggong"
Página delantera > Programación > ¿Cómo puedo lograr un comportamiento covariante con acceso indexado en las colecciones de .NET?

¿Cómo puedo lograr un comportamiento covariante con acceso indexado en las colecciones de .NET?

Publicado el 2025-02-10
Navegar:681

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

entendiendo covarianza y limitaciones de ilist

covarianza es un principio en la programación donde un tipo de referencia puede asignarse a una variable de una base o interfaz tipo. Sin embargo, esto plantea un dilema cuando se trata de colecciones, específicamente cuando consideramos la interfaz ilist.

ilist representa una colección con acceso indexado, lo que nos permite recuperar elementos por su índice. Desafortunadamente, las colecciones de .NET incorporadas como List implementan los indexadores GET y SET, lo que evita que sean completamente covariantes.

para colecciones covariantes con acceso indexado

A pesar de esta limitación, hay formas de lograr un comportamiento covariante mientras se mantiene el acceso indexado.

1. ReadOnlyCollections (desde .NET 4.5 en adelante)

IReadonlyList e IreadonlyCollection son interfaces covariantes introducidas en .NET 4.5. Solo tienen un indexador Get, haciéndolos adecuados para escenarios covariantes. List y ReadonlyCollection implementan ambas interfaces.

2. WRAPPER Custom

Si necesita una colección covariante con acceso indexado en versiones anteriores de .NET, puede crear una clase de envoltorio. La clase de envoltorio encapsularía una ilist y solo expondría el indexador get e IEnumerable interfaces.

El siguiente código demuestra una clase de envoltura personalizada llamada CovariantList que proporciona acceso covariante a un ilist :

public static class Covariance
{
    public static IIndexedEnumerable AsCovariant(this IList tail)
    {
        return new CovariantList(tail);
    }

    private class CovariantList : IIndexedEnumerable
    {
        private readonly IList tail;

        public CovariantList(IList tail)
        {
            this.tail = tail;
        }

        public T this[int index] { get { return tail[index]; } }
        public IEnumerator GetEnumerator() { return tail.GetEnumerator();}
        IEnumerator IEnumerable.GetEnumerator() { return tail.GetEnumerator(); }
        public int Count { get { return tail.Count; } }
    }
}

public interface IIndexedEnumerable : IEnumerable
{
    T this[int index] { get; }
    int Count { get; }
}
Último tutorial Más>

Descargo de responsabilidad: Todos los recursos proporcionados provienen en parte de Internet. Si existe alguna infracción de sus derechos de autor u otros derechos e intereses, explique los motivos detallados y proporcione pruebas de los derechos de autor o derechos e intereses y luego envíelos al correo electrónico: [email protected]. Lo manejaremos por usted lo antes posible.

Copyright© 2022 湘ICP备2022001581号-3