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

Wie kann ich in C# sicher eine „Liste' in eine „Liste' umwandeln?

Mary-Kate Olsen
Freigeben: 2025-01-09 22:51:46
Original
732 Leute haben es durchsucht

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

List sicher in List konvertieren

In C# kann es beim Umgang mit Vererbung und generischen Typen zu Situationen kommen, in denen Sie eine Liste abgeleiteter Klassenobjekte in eine Liste von Basisklassenobjekten konvertieren müssen. Dies kann zu Problemen führen, wenn die Basisklasse virtuelle Methoden enthält, die in der abgeleiteten Klasse überschrieben werden.

Betrachten Sie das folgende Beispiel:

<code class="language-csharp">class Animal
{
    public virtual void Play(List<Animal> animals) { }
}

class Cat : Animal
{
    public override void Play(List<Animal> animals)
    {
        // Cat 特定的实现
    }
}

class Program
{
    static void Main(string[] args)
    {
        Cat cat = new Cat();
        cat.Play(new List<Cat>()); // 错误:参数 1 无法从“System.Collections.Generic.List<Cat>”转换为“System.Collections.Generic.List<Animal>”
    }
}</code>
Nach dem Login kopieren

Beim Kompilieren dieses Codes wird die Fehlermeldung „Parameter 1: Konvertierung von ‚System.Collections.Generic.List‘ in ‚System.Collections.Generic.List‘“ nicht möglich sein.“ Dies liegt daran, dass die Cat-Klasse zwar die Play-Methode überschreibt, der Methodenparametertyp (List) jedoch derselbe bleibt.

Um dieses Problem zu lösen, müssen Sie das Konzept der generischen Kovarianz verstehen. Mit der generischen Kovarianz können Sie den Typ eines Parameters in einer abgeleiteten Klassenüberschreibung sicher erweitern. In diesem Fall möchten Sie den Parametertyp von List auf List erweitern.

C# 4 führt mit Hilfe von IEnumerable und seiner kovarianzsicheren Schnittstelle Unterstützung für generische Kovarianz ein. Durch Deklaration der Play-Methode in der Animal-Klasse als:

<code class="language-csharp">public virtual void Play(IEnumerable<Animal> animals) { }</code>
Nach dem Login kopieren

Dann überschreiben Sie es in der Cat-Klasse:

<code class="language-csharp">public override void Play(IEnumerable<Animal> animals) { }</code>
Nach dem Login kopieren

Sie können die Play-Methode kovariantensicher machen. Dadurch können Sie eine List an die Methode übergeben und diese dann mithilfe der Kovarianz sicher in ein IEnumerable konvertieren. Der geänderte Code sieht so aus:

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

Dieser Code wird ohne Fehler kompiliert und ausgeführt, sodass Sie List< sicher konvertieren können, wenn eine Basisklassenmethode mit IEnumerable zur Liste.

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