Heim > Backend-Entwicklung > C++ > Wie kann ich Kovarianz mit Indexzugriff in .NET-Sammlungen erreichen?

Wie kann ich Kovarianz mit Indexzugriff in .NET-Sammlungen erreichen?

Patricia Arquette
Freigeben: 2024-12-28 12:51:24
Original
161 Leute haben es durchsucht

How Can I Achieve Covariance with Index Access in .NET Collections?

Kovarianz mit Indexzugriffsunterstützung in .NET nutzen

Kovarianz ermöglicht es Programmierern, abgeleitete Klassen als ihre Basisklassen ohne explizite Typumwandlung zu behandeln. In .NET gibt es jedoch eine Einschränkung bei kovarianten Sammlungen, die keinen Indexzugriff unterstützen. Dieses Problem tritt auf, wenn versucht wird, eine Sammlung bestimmter Typen (z. B. eine Liste mit Hundeobjekten) in eine Sammlung ihres Basistyps (z. B. Tier) zu konvertieren.

Verstehen des zugrunde liegenden Problems

Das Problem ergibt sich aus der Tatsache, dass List ICollection implementiert, das eine Add-Methode umfasst. Das Upcasting in eine tierbasierte IList würde das wahllose Hinzufügen jeder Art von Tier ermöglichen und die Typbeschränkungen der ursprünglichen Sammlung verletzen.

Kovariante Sammlungen mit Indexunterstützung

In .NET 4.5 und später:

  • IReadOnlyList und IReadOnlyCollection sind beide kovariant.
  • List Implementieren Sie diese Schnittstellen und stellen Sie einen Nur-Get-Indexer bereit, der Elemente abrufen kann, ohne die Kovarianzprinzipien zu verletzen.

Für frühere .NET-Versionen:

  • Kovarianz mit Indexunterstützung ist in früheren .NET-Versionen nicht nativ verfügbar.
  • Benutzerdefinierter Wrapper Ansatz: Eine Lösung besteht darin, die ursprüngliche Sammlung in eine benutzerdefinierte Klasse zu packen, die nur die IEnumerable- und Get-Indexer-Schnittstellen verfügbar macht. Dieser Ansatz stellt Kovarianz sicher und behält gleichzeitig die Indexzugriffsfunktionalität bei.

Implementierung:

Der folgende C#-Code demonstriert den benutzerdefinierten Wrapper-Ansatz unter Verwendung der Kovarianz-Erweiterungsmethode:

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; }
}
Nach dem Login kopieren

Mit dieser Erweiterungsmethode können Sie eine kovariante Sammlung mit Indexunterstützung erstellen, wie im Folgenden dargestellt Beispiel:

List<Dog> dogs = new List<Dog>();

IIndexedEnumerable<Animal> animals = dogs.AsCovariant();
Nach dem Login kopieren

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

Quelle:php.cn
Erklärung dieser Website
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
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage