Maison > développement back-end > C++ > Comment puis-je créer une liste de types génériques ouverts en C# ?

Comment puis-je créer une liste de types génériques ouverts en C# ?

DDD
Libérer: 2025-01-11 08:42:40
original
703 Les gens l'ont consulté

How Can I Create a List of Open Generic Types in C#?

Gestion des listes de types génériques ouverts en C#

Travailler avec des types génériques ouverts (génériques avec des paramètres de type non spécifiés) en C# présente des défis en raison des limitations du polymorphisme générique.

Le défi :

Considérez ces cours :

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

public class StringData : Data<string> { }

public class DecimalData : Data<decimal> { }</code>
Copier après la connexion

La tentative de création d'une liste contenant des instances de ces différents Data types échoue directement :

<code class="language-csharp">List<Data> dataCollection = new List<Data>(); // Compiler error!
dataCollection.Add(new DecimalData());
dataCollection.Add(new StringData());</code>
Copier après la connexion

L'erreur du compilateur se produit car Data est un type générique ouvert, nécessitant un argument de type.

La solution :

L'absence d'opérateur diamant en C# empêche l'instanciation directe de listes de génériques ouverts. Le polymorphisme ne s'applique pas directement aux types génériques ouverts. La solution de contournement consiste à utiliser un type ou une interface de base commune :

<code class="language-csharp">public interface IData { void SomeMethod(); }

public abstract class DataBase { public abstract void SomeMethod(); }</code>
Copier après la connexion

Maintenant, vous pouvez créer une liste en utilisant l'interface ou la classe de base :

<code class="language-csharp">List<IData> dataList = new List<IData>();
dataList.Add(new StringData()); // StringData must implement IData
dataList.Add(new DecimalData()); // DecimalData must implement IData

foreach (var item in dataList)
    item.SomeMethod();


List<DataBase> dataBaseList = new List<DataBase>();
dataBaseList.Add(new StringData()); // StringData must inherit from DataBase
dataBaseList.Add(new DecimalData()); // DecimalData must inherit from DataBase

foreach (var item in dataBaseList)
    item.SomeMethod();</code>
Copier après la connexion

Cette approche permet une collection de différents Data types, mais elle sacrifie un typage fort par rapport à une solution véritablement générique. L'exemple SomeMethod() met en évidence la nécessité d'une interface commune ou d'une méthode abstraite pour maintenir les fonctionnalités entre différents types.

Lectures complémentaires :

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