c # Dans la programmation orientée objet, l'héritage de classe dérivé est très courant. Cependant, lors du traitement de l'ensemble (comme une liste), pourquoi il n'est pas possible d'utiliser la même classe de base pour les déclarer, ce qui peut être déroutant.
Considérez le code suivant:
Ce code provoquera des erreurs de compilation lors de l'utilisation de
<code class="language-csharp">interface A { } class B : A { } class C : B { } class Test { static void Main(string[] args) { A a = new C(); // 正确 List<A> listOfA = new List<C>(); // 编译错误 } }</code>
. Bien que l'instance de la classe C dérivée puisse être attribuée à la variable de classe de base A, la collection n'est pas bonne. List<C>
List<A>
La raison de cette limite réside dans la méthode de la liste d'initialisation C #. Lors de la création , C # générera la structure de données interne de la liste lors de l'exécution, et il est prévu que le type de stockage soit un objet de A. Cependant, parce que C est une classe dérivée de A, son objet a des membres supplémentaires et occupe plus de mémoire qu'un objet. Par conséquent, l'attribution à
List<A>
Afin de résoudre ce problème et de modifier List<C>
comme List<A>
, vous pouvez utiliser les méthodes suivantes:
<.> 1. Exprimant la conversion: List<派生类>
List<基类>
<.> 2. Linq:
Utilisez LINQ pour convertir l'élément comme suit:
<code class="language-csharp">List<A> listOfA = new List<C>().ConvertAll(x => (A)x);</code>
Ces méthodes permettent une conversion sûre et un alignement de l'adresse mémoire pour garantir le fonctionnement normal de la liste.
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!