Maison >développement back-end >C++ >Pourquoi l'initialisation de la liste échoue-t-elle avec un type ouvert générique en C# ?

Pourquoi l'initialisation de la liste échoue-t-elle avec un type ouvert générique en C# ?

DDD
DDDoriginal
2025-01-11 06:00:42278parcourir

Why Does List Initialization Fail with a Generic Open Type in 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 :

  1. 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.

  2. 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!

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