Maison >développement back-end >C++ >Comment puis-je contraindre un type générique à avoir un constructeur spécifique en C# ?

Comment puis-je contraindre un type générique à avoir un constructeur spécifique en C# ?

Susan Sarandon
Susan Sarandonoriginal
2025-01-14 16:07:44328parcourir

How Can I Constrain a Generic Type to Have a Specific Constructor in C#?

Types génériques C# : contraintes de paramètres de constructeur

C# permet de limiter les méthodes génériques à des types possédant des constructeurs sans paramètre (where T : new()). Cependant, la spécification directe d'un constructeur avec des types de paramètres particuliers comme contrainte n'est pas prise en charge.

Exemple de contrainte valide :

<code class="language-csharp">public class A
{
    public static T Method<T>(T a) where T : new()
    {
        // ... some code ...
        return new T();
    }
}</code>

Cela limite correctement T aux types avec un constructeur par défaut. Cependant, ce qui suit entraînera une erreur de compilation :

<code class="language-csharp">public class A
{
    public static T Method<T>(T a) where T : new(float[,] u)
    {
        // ... some code ...
        return new T(new float[0, 0]);
    }
}</code>

Approche alternative

Pour contourner cette limitation, utilisez un délégué pour fournir un constructeur acceptant le type de paramètre requis :

<code class="language-csharp">public class A
{
    public static void Method<T>(T a, Func<float[,], T> creator)
    {
        // ... some code ...
        T instance = creator(new float[0, 0]); // Create T using the supplied delegate
    }
}</code>

Ici, le délégué creator reçoit un float[,] et renvoie une instance T. La fonction Method utilise ensuite ce délégué pour la création d'objets. Cela offre une flexibilité dans la spécification des paramètres du constructeur sans recourir à des mécanismes de contrainte directe.

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