Maison >développement back-end >C++ >Pourquoi l'initialisation de la liste échoue-t-elle avec un type ouvert générique en C# ?
Échec d'initialisation de la liste de types ouverts générique C# : une solution
Lorsque vous travaillez avec des types ouverts génériques comme Data<T>
et leurs types construits fermés (par exemple, StringData
, DecimalData
), tenter de créer une liste à l'aide de List<Data>
entraîne une erreur du compilateur : "Utilisation du type générique 'Données' nécessite des arguments de 1 type." En effet, C# ne prend pas en charge l'opérateur Diamond pour les types génériques ouverts ; un argument de type concret est toujours nécessaire.
Le problème expliqué
Le compilateur doit connaître le type spécifique au sein de la classe Data<T>
pour créer une liste. List<Data>
est ambigu ; il ne précise pas quel type T
représente.
Solutions efficaces
Voici deux approches pratiques pour résoudre ce problème :
Implémentation de l'interface : Créez une interface (par exemple, IData
) que Data<T>
et ses types dérivés implémentent. Ensuite, déclarez votre liste comme List<IData>
. Cela exploite le polymorphisme, vous permettant de stocker des instances de différents Data<T>
types dans la même liste.
Classe de base abstraite : Définissez une classe de base abstraite (par exemple, DataBase
) pour Data<T>
. Dérivez vos types concrets de cette classe de base. Vous pouvez ensuite créer une liste de List<DataBase>
. Cela fournit un typage fort mais avec moins de généricité par rapport à l'approche d'interface.
Considérations
Les deux méthodes introduisent un certain degré de complexité de conception. Le choix dépend des besoins spécifiques de votre application. Les interfaces offrent une plus grande flexibilité, tandis que les classes de base abstraites offrent une approche plus structurée.
Lectures complémentaires
Pour une compréhension plus approfondie des génériques, de la variance et du polymorphisme en C#, reportez-vous à ces ressources :
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!