„Wenn ein Arbeiter seine Arbeit gut machen will, muss er zuerst seine Werkzeuge schärfen.“ – Konfuzius, „Die Gespräche des Konfuzius. Lu Linggong“
Titelseite > Programmierung > Wie kann ich kovarianisches Verhalten mit indizierten Zugriff in .NET -Sammlungen erreichen?

Wie kann ich kovarianisches Verhalten mit indizierten Zugriff in .NET -Sammlungen erreichen?

Gepostet am 2025-02-10
Durchsuche:124

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

Verständnis der Kovarianz- und ilistischen Einschränkungen

Kovarianz sind ein Prinzip in der Programmierung, bei dem ein Referenztyp einer Variablen einer Basis oder Schnittstelle zugewiesen werden kann Typ. Dies ist jedoch ein Dilemma in Bezug auf Sammlungen, insbesondere wenn wir die ilistische Schnittstelle betrachten. Leider implementieren integrierte .NET-Sammlungen wie List sowohl die GET als auch die Set-Indexer implementieren, die verhindert, dass sie vollständig kovarianten. ]

Trotz dieser Einschränkung gibt es Möglichkeiten, kovarianisches Verhalten zu erreichen und gleichzeitig den indizierten Zugriff zu erhalten.

1. ReadonlyCollections (ab .net 4.5)

ireadonlyList und ireadonlyCollection sind kovariante Schnittstellen, die in .NET 4.5 eingeführt wurden. Sie haben nur einen Get -Indexer, der sie für kovariante Szenarien geeignet macht. List und ReadonlyCollection Implementieren Sie beide Schnittstellen.

2. Benutzerdefinierte Wrapper

Wenn Sie eine kovariante Sammlung mit indizierten Zugriff in früheren Versionen von .NET benötigen, können Sie eine Wrapper -Klasse erstellen. Die Wrapper -Klasse würde einen ilist zusammenschließen und nur die Get -Indexer- und IEnumerable -Schnizeln entlarven.

Der folgende Code zeigt eine benutzerdefinierte Wrapper -Klasse namens Covariantlist , die Covariant -Zugriff auf einen Ilist :

öffentliche statische Klasse Kovarianz { Öffentliche statische iIndexedenumerable Ascovariante (dieser ilistische Schwanz) { RECHTEN SIE NEUE COVARIANTLISTE (Schwanz); } private Klasse CovariantList : iIndexEneNumerable { private readonly ilist schwanz; öffentliche Kovariante (ilist Tail) { this.tail = schwanz; } 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; }} } } öffentliche Schnittstelle iIndexEdenumerable : iEnumerable { T this [int index] {get; } int count {get; } }

Neuestes Tutorial Mehr>

Haftungsausschluss: Alle bereitgestellten Ressourcen stammen teilweise aus dem Internet. Wenn eine Verletzung Ihres Urheberrechts oder anderer Rechte und Interessen vorliegt, erläutern Sie bitte die detaillierten Gründe und legen Sie einen Nachweis des Urheberrechts oder Ihrer Rechte und Interessen vor und senden Sie ihn dann an die E-Mail-Adresse: [email protected] Wir werden die Angelegenheit so schnell wie möglich für Sie erledigen.

Copyright© 2022 湘ICP备2022001581号-3