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
Libérer: 2025-01-17 01:01:12
original
321 Les gens l'ont consulté

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>();
Copier après la connexion

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

List<IDic> dics = (List<IDic>)clients;
Copier après la connexion

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>'
Copier après la connexion

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];
Copier après la connexion

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>();
Copier après la connexion
  • 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();
Copier après la connexion

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!

source:php.cn
Déclaration de ce site Web
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
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal