Maison >développement back-end >C++ >Pourquoi ne puis-je pas convertir directement une « liste » en « liste » en C# ?

Pourquoi ne puis-je pas convertir directement une « liste » en « liste » en C# ?

DDD
DDDoriginal
2025-01-17 01:01:12326parcourir

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

Liste de coulée vers List

Considérez le code suivant :

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

}

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

De nombreux programmeurs peuvent supposer qu'ils peuvent diffuser cette List à une liste :

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

Cependant, ce n'est pas une distribution valide. Ce type de conversion n'est pas autorisé car il violerait la sécurité du type. Si vous tentez cette diffusion, l'erreur suivante se produira :

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

Pourquoi cette diffusion n'est-elle pas autorisée ?

La raison pour laquelle cette diffusion est refusée est due à la potentiel de comportement dangereux. Par exemple, imaginez ce scénario :

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];

Dans cet exemple, la liste est converti en List. Cela permet d'ajouter un objet Banane à la liste des fruits. Cependant, lorsque l'on accède au premier élément de la liste des pommes, il est toujours traité comme une pomme. Cela peut entraîner un comportement inattendu et des bugs potentiels.

Options de conversion sécurisées

Bien que vous ne puissiez pas lancer directement une liste en List, il existe des moyens sûrs de convertir entre ces types.

  • ToList() : dans .NET 4.0 et supérieur, vous pouvez utiliser le ToList() pour convertir une méthode List vers une nouvelle Liste. Cette méthode crée une nouvelle liste avec les mêmes éléments mais en utilisant le type d'interface spécifié.
List<IFruit> fruit = apples.ToList<IFruit>();
  • Cast().ToList() : In .NET 3.5, vous pouvez utiliser la méthode Cast() pour obtenir un fichier IEnumerable à partir d'une liste. Ensuite, vous pouvez utiliser ToList() pour créer une nouvelle liste à partir de IEnumerable.
List<IFruit> fruit = apples.Cast<IFruit>().ToList();

Il est important de noter que ces conversions créent de nouvelles listes. Les modifications apportées à une liste ne seront pas reflétées dans l'autre. Cependant, les modifications apportées aux objets dans les listes seront visibles dans les deux listes.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn