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
Mary-Kate OlsenOriginal
2025-01-09 22:51:46759Durchsuche

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>

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>

Dann überschreiben Sie es in der Cat-Klasse:

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

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>

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!

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