Maison > développement back-end > C++ > Une liste C# peut-elle contenir plusieurs instances de classe générique avec différents paramètres de type ?

Une liste C# peut-elle contenir plusieurs instances de classe générique avec différents paramètres de type ?

Mary-Kate Olsen
Libérer: 2025-01-18 16:36:09
original
601 Les gens l'ont consulté

Can a C# List Hold Multiple Generic Class Instances with Different Type Parameters?

Pouvez-vous créer une liste de types génériques en C# ?

En C#, vous pouvez créer une classe avec des paramètres de type génériques. Cependant, est-il possible de créer une liste contenant plusieurs instances différentes de cette classe générique avec différents paramètres de type ?

Considérons l'exemple suivant :

<code class="language-csharp">public class Metadata<DataType> where DataType : struct
{
    private DataType mDataType;
}</code>
Copier après la connexion

Ici, nous avons une classe générique Metadata qui peut être utilisée pour différents types de valeur. Maintenant, disons que nous voulons créer une liste de ces Metadata objets, qui ont différents types. Pouvons-nous le faire ?

<code class="language-csharp">List<Metadata<DataType>> metadataObjects; // 错误:DataType 未定义
metadataObjects.Add(new Metadata<int>());
metadataObjects.Add(new Metadata<bool>());
metadataObjects.Add(new Metadata<double>());</code>
Copier après la connexion

Malheureusement, cela n'est pas possible en C# car le paramètre de type générique d'une liste doit être le même pour tous les éléments. Pour surmonter cette limitation, l'héritage et les classes abstraites peuvent être utilisés.

<code class="language-csharp">public abstract class MetadataBase
{
}

// 继承抽象 MetadataBase 类
public class Metadata<DataType> : MetadataBase where DataType : struct
{
    private DataType mDataType;
}</code>
Copier après la connexion

Vous pouvez maintenant créer une liste de classes de base abstraites MetadataBase. Cela permet d'ajouter différents types d'objets Metadata à la liste :

<code class="language-csharp">List<MetadataBase> metadataObjects = new List<MetadataBase>();
metadataObjects.Add(new Metadata<int>());
metadataObjects.Add(new Metadata<bool>());
metadataObjects.Add(new Metadata<double>());</code>
Copier après la connexion

En utilisant une classe de base abstraite, nous créons avec succès une liste pouvant contenir des instances de différents types Metadata. Il est à noter qu'une conversion de type est requise lors de l'accès à l'attribut mDataType d'un élément de la liste, car MetadataBase ne contient pas cet attribut. Cela doit être traité au cas par cas, par exemple en utilisant les types dynamic ou l'opérateur is pour la vérification et la conversion de type.

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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal