Heim >Backend-Entwicklung >C++ >Wie kann ich kovariantes Verhalten mit indiziertem Zugriff in .NET-Sammlungen erreichen?

Wie kann ich kovariantes Verhalten mit indiziertem Zugriff in .NET-Sammlungen erreichen?

Barbara Streisand
Barbara StreisandOriginal
2024-12-30 10:43:10367Durchsuche

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

Kovarianz und IList-Einschränkungen verstehen

Kovarianz ist ein Prinzip in der Programmierung, bei dem ein Referenztyp einer Variablen einer Basis oder Schnittstelle zugewiesen werden kann Typ. Dies stellt jedoch ein Dilemma dar, wenn es um Sammlungen geht, insbesondere wenn wir die IList-Schnittstelle betrachten.

IList stellt eine Sammlung mit indiziertem Zugriff dar, die es uns ermöglicht, Elemente anhand ihres Index abzurufen. Leider sind integrierte .NET-Sammlungen wie List Implementieren Sie sowohl die Get- als auch die Set-Indexer, was verhindert, dass sie vollständig kovariant sind.

Lösungen für kovariante Sammlungen mit indiziertem Zugriff

Trotz dieser Einschränkung gibt es Möglichkeiten, dies zu erreichen kovariantes Verhalten unter Beibehaltung des indizierten Zugriffs.

1. ReadOnlyCollections (ab .NET 4.5)

IReadOnlyList und IReadOnlyCollection sind kovariante Schnittstellen, die in .NET 4.5 eingeführt wurden. Sie verfügen nur über einen Get-Indexer, wodurch sie für kovariante Szenarien geeignet sind. Liste und ReadOnlyCollection beide Schnittstellen implementieren.

2. Benutzerdefinierter Wrapper

Wenn Sie in früheren Versionen von .NET eine kovariante Sammlung mit indiziertem Zugriff benötigen, können Sie eine Wrapper-Klasse erstellen. Die Wrapper-Klasse würde eine IList und nur den Get-Indexer und IEnumerable verfügbar machen. Schnittstellen.

Der folgende Code demonstriert eine benutzerdefinierte Wrapper-Klasse namens CovariantList das bietet kovarianten Zugriff auf eine 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; }
}

Das obige ist der detaillierte Inhalt vonWie kann ich kovariantes Verhalten mit indiziertem Zugriff in .NET-Sammlungen erreichen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn