Heim >Backend-Entwicklung >C++ >Kann ich in C# eine „Liste' in eine „Liste' umwandeln?

Kann ich in C# eine „Liste' in eine „Liste' umwandeln?

Patricia Arquette
Patricia ArquetteOriginal
2025-01-09 22:32:47346Durchsuche

Can I Cast a `List` to a `List` in C#?

Abgeleitete Klassenliste in Basisklassenliste konvertieren

Kovarianz bedeutet, dass ein abgeleiteter Typ seinen Basistyp ersetzen kann, ohne Funktionalität zu verlieren. In diesem Fall haben wir eine Basisklasse (Animal) und eine abgeleitete Klasse (Cat), wobei die Basisklasse eine virtuelle Methode Play enthält, die eine Liste als Eingabeparameter akzeptiert.

Der folgende Code veranschaulicht das Konvertierungsproblem:

<code class="language-csharp">using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ConsoleApplication9
{
    class Animal
    {
        public virtual void Play(List<Animal> animals) { }
    }
    class Cat : Animal
    {
        public override void Play(List<Animal> animals)
        {
        }
    }

    class Program
    {
        static void Main(string[] args)
        {
            Cat cat = new Cat();
            cat.Play(new List<Cat>());
        }
    }
}</code>

Das Kompilieren des Codes führt zu folgendem Fehler: Argument 1: Kann nicht von „System.Collections.Generic.List“ in „System.Collections.Generic.List“ konvertiert werden.

Dieser Fehler tritt auf, weil List eine beschreibbare Datenstruktur ist. Wenn wir die Konvertierung von List in List zulassen, können Hunde zur Katzenliste hinzugefügt werden, was zu unerwartetem Verhalten führen kann.

Um dieses Problem zu lösen, führte C# 4 ein Konzept namens „generische Kovarianz“ für bekanntermaßen sichere Schnittstellen ein. IEnumerable ist eine solche Schnittstelle. Da IEnumerable keine Mutation zulässt, gilt es als kovariante sicher.

Wir können das Konvertierungsproblem lösen, indem wir die Play-Methode so ändern, dass sie ein IEnumerable anstelle einer Liste akzeptiert:

<code class="language-csharp">class Animal
{
    public virtual void Play(IEnumerable<Animal> animals) { }
}
class Cat : Animal
{
    public override void Play(IEnumerable<Animal> animals) { }
}
class Program
{
    static void Main()
    {
        Cat cat = new Cat();
        cat.Play(new List<Cat>());
    }
}</code>

Durch die Verwendung der IEnumerable<T>-Schnittstelle anstelle von List<T> nutzen wir die Kovarianzfunktion von C#, vermeiden Typkonvertierungsfehler und gewährleisten die Sicherheit des Codes. IEnumerable<T> ermöglicht nur das Lesen, nicht das Ändern von Daten, daher ist die Konvertierung von List<Cat> in IEnumerable<Animal> sicher.

Das obige ist der detaillierte Inhalt vonKann ich in C# eine „Liste' in eine „Liste' umwandeln?. 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