Heim >Backend-Entwicklung >C++ >Warum kann ich in C# eine „Liste' nicht direkt in eine „Liste' umwandeln?

Warum kann ich in C# eine „Liste' nicht direkt in eine „Liste' umwandeln?

DDD
DDDOriginal
2025-01-17 01:01:12373Durchsuche

Why Can't I Directly Cast a `List` to a `List` in C#?

Betonliste to List

Bedenken Sie den folgenden Code:

public interface IDic
{
    int Id { get; set; }
    string Name { get; set; }
}
public class Client : IDic
{

}

List<Client> clients = new List<Client>();

Viele Programmierer gehen möglicherweise davon aus, dass sie diese List zu einer Liste:

List<IDic> dics = (List<IDic>)clients;

Dies ist jedoch keine gültige Besetzung. Diese Art der Umwandlung ist nicht zulässig, da sie die Typsicherheit verletzen würde. Wenn Sie diesen Zauber versuchen, tritt der folgende Fehler auf:

Cannot convert type 'System.Collections.Generic.List<Client>' to 'System.Collections.Generic.List<IDic>'

Warum ist dieser Zauber nicht zulässig?

Der Grund, warum dieser Zauber nicht zulässig ist, liegt an der Potenzial für unsicheres Verhalten. Stellen Sie sich zum Beispiel dieses Szenario vor:

public interface IFruit {}

public class Apple : IFruit {}
public class Banana : IFruit {}

...

List<Apple> apples = new List<Apple>();
List<IFruit> fruit = (List<IFruit>)apples; // Assumed cast
fruit.Add(new Banana());

// Eek - it's a banana!
Apple apple = apples[0];

In diesem Beispiel ist die Liste wird in eine Liste umgewandelt. Dadurch kann ein Banana-Objekt zur Obstliste hinzugefügt werden. Wenn jedoch auf das erste Element der Apfelliste zugegriffen wird, wird es immer noch als Apfel behandelt. Dies kann zu unerwartetem Verhalten und potenziellen Fehlern führen.

Sichere Konvertierungsoptionen

Während Sie eine List in eine List gibt es sichere Möglichkeiten zum Konvertieren zwischen diesen Typen.

  • ToList(): In .NET 4.0 und höher können Sie die verwenden ToList()-Methode zum Konvertieren einer List in eine neue Liste einfügen. Diese Methode erstellt eine neue Liste mit denselben Elementen, aber unter Verwendung des angegebenen Schnittstellentyps.
List<IFruit> fruit = apples.ToList<IFruit>();
  • Cast().ToList(): In .NET 3.5 können Sie die Methode Cast() verwenden, um ein IEnumerable zu erhalten. aus einer Liste. Anschließend können Sie mit ToList() eine neue List erstellen. aus dem IEnumerable.
List<IFruit> fruit = apples.Cast<IFruit>().ToList();

Es ist wichtig zu beachten, dass diese Konvertierungen neue Listen erstellen. An einer Liste vorgenommene Änderungen werden in der anderen nicht übernommen. Änderungen an den Objekten in den Listen werden jedoch in beiden Listen sichtbar.

Das obige ist der detaillierte Inhalt vonWarum kann ich in C# eine „Liste' nicht direkt 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