0Pricing
C# Academy · Leçon

Contraintes where

Contraignez les paramètres de type.

Contraintes where est une leçon C# Academy gratuite sur CoddyKit. Ceci est la leçon 3 sur 4. Tu peux lire la leçon complète ci-dessous gratuitement — puis la pratiquer en direct dans le navigateur avec un éditeur de code intégré et un tuteur IA 24/7. Elle fait partie du parcours d'apprentissage C# Academy, et ta progression se synchronise sur le web et l'application CoddyKit. Le cours C# Academy comprend 4 leçons au total.

Pourquoi les contraintes existent

Par défaut, un paramètre de type T est traité presque comme object, si bien que le compilateur autorise très peu d'opérations sur lui. Les contraintes, écrites avec where, donnent au compilateur davantage d'informations sur T.

Grâce à ces informations, vous pouvez appeler des méthodes, construire des instances ou comparer des valeurs en toute sécurité.

void Show<T>(T value) where T : IFormattable
{
    // now ToString(format, provider) is available
}

Contraintes d'interface

Une contrainte d'interface exige que T implémente une interface donnée. Le corps de la méthode peut alors appeler les membres de cette interface.

Ci-dessous, where T : IComparable<T> garantit qu'une méthode CompareTo existe.

T Max<T>(T a, T b) where T : IComparable<T>
    => a.CompareTo(b) >= 0 ? a : b;

Contraintes de classe de base

Vous pouvez exiger que T dérive d'une classe de base précise. Les membres de ce type de base sont alors utilisables dans le code générique.

C'est courant dans les infrastructures où toutes les entités partagent un type de base.

class Animal { public string Name = ""; }

string NameOf<T>(T a) where T : Animal => a.Name;

La contrainte class

where T : class exige que T soit un type référence. Cela autorise l'affectation de null et les vérifications d'égalité des références.

Cette contrainte est courante pour les référentiels, les caches et tout ce qui stocke des références susceptibles d'être nulles.

T? FindOrNull<T>(bool found, T value) where T : class
    => found ? value : null;

La contrainte struct

where T : struct exige que T soit un type valeur non nullable. Vous pouvez ainsi traiter T comme un type valeur et utiliser T? comme un type valeur nullable.

Elle est utilisée par les outils qui fonctionnent uniquement avec des nombres, des énumérations ou de petites structures.

T? AsNullable<T>(T value) where T : struct
    => value;

La contrainte new()

La contrainte new() exige que T possède un constructeur public sans paramètre. Le corps de la méthode peut alors écrire new T().

Les fabriques et les pools d'objets s'appuient sur cette contrainte pour créer des instances de manière générique.

using System;

class Program
{
    static T Make<T>() where T : new() => new T();

    static void Main()
    {
        var list = Make<System.Collections.Generic.List<int>>();
        Console.WriteLine(list.Count);
    }
}

Combiner des contraintes

Vous pouvez appliquer plusieurs contraintes à un même paramètre. Les règles d'ordre imposent de placer class ou struct en premier, puis la classe de base, les interfaces et enfin new().

Les contraintes sont énumérées après une seule clause where, séparées par des virgules.

T Build<T>() where T : class, IComparable<T>, new()
    => new T();

Plusieurs clauses where

Lorsqu'une méthode ou une classe comporte plusieurs paramètres de type, chacun reçoit sa propre clause where. Elles sont écrites l'une après l'autre.

Ainsi, les contraintes de chaque paramètre restent clairement séparées.

TResult Convert<TInput, TResult>(TInput x)
    where TInput : class
    where TResult : new()
    => new TResult();

Un exemple de contrainte exécutable

Ce programme complet utilise une contrainte IComparable<T> pour trouver la plus grande de deux valeurs, avec des entiers comme avec des chaînes.

La contrainte rend l'appel à CompareTo légal dans la méthode.

using System;

class Program
{
    static T Max<T>(T a, T b) where T : IComparable<T>
        => a.CompareTo(b) >= 0 ? a : b;

    static void Main()
    {
        Console.WriteLine(Max(3, 9));
        Console.WriteLine(Max("apple", "pear"));
    }
}

Les contraintes notnull et unmanaged

Les versions récentes de C# ajoutent d'autres contraintes. where T : notnull interdit les types nullables, ce qui est utile pour les clés de dictionnaire. where T : unmanaged limite T aux types valeur blittables pour le code de bas niveau.

Ces contraintes renforcent la sécurité dans les cas d'utilisation spécialisés.

void Use<T>(T key) where T : notnull { }

unsafe void Raw<T>(T v) where T : unmanaged { }

Les contraintes permettent, elles ne limitent pas, les possibilités

Bien qu'elles ressemblent à des restrictions, les contraintes débloquent en réalité des fonctionnalités. Sans contrainte, vous pouvez à peine manipuler T ; avec une contrainte, vous accédez à ses membres.

Choisissez la contrainte minimale qui permet à votre algorithme de fonctionner, afin de garder le paramètre de type aussi flexible que possible.

// No constraint: only object members available
string Name<T>(T x) => x.ToString();

Vérification rapide

Vérifiez votre compréhension des contraintes where.

Récapitulatif

La clause where impose des contraintes aux paramètres de type : interface, classe de base, class, struct, new(), notnull et unmanaged. Chaque contrainte débloque certaines opérations sur T.

Respectez leur ordre, utilisez une clause par paramètre et choisissez la contrainte minimale dont votre algorithme a besoin.

Questions Fréquemment Posées

La leçon « Contraintes where » est-elle gratuite ?

Oui — le texte complet de « Contraintes where » est gratuit à lire ici sur le web. Pour la pratiquer de manière interactive (un éditeur de code intégré et un tuteur IA 24/7) et déverrouiller le reste du cours C# Academy, passe à CoddyKit PRO. Le cours C# Academy comprend 4 leçons au total.

Qu'est-ce que j'apprendrai dans « Contraintes where » ?

Contraignez les paramètres de type. Tu pratiques C# Academy avec du code pratique que tu exécutes directement dans le navigateur, et un tuteur IA 24/7 répond à tes questions au fur et à mesure que tu avances dans la leçon.

Dois-je avoir de l'expérience pour commencer C# Academy ?

Aucune expérience préalable n'est requise. C# Academy sur CoddyKit est structuré pour les débutants jusqu'aux apprenants avancés, donc tu peux commencer ici ou depuis le début et avancer à ton rythme. Ceci est la leçon 3 sur 4.

Combien de temps prend la leçon « Contraintes where » ?

La plupart des leçons CoddyKit prennent environ 5–10 minutes. Chacune est courte et interactive, tu progresses régulièrement et tu repiques exactement où tu t'es arrêté sur le web et l'app.

Peux-tu écrire et exécuter du code dans cette leçon C# Academy ?

Oui. Chaque leçon C# Academy inclut un éditeur de code intégré, tu écris et exécutes du vrai code directement dans ton navigateur et tu reçois des retours IA instantanés — aucune configuration locale requise.

Toutes les leçons de ce cours

  1. Méthodes génériques
  2. Classes génériques
  3. Contraintes where
  4. Interfaces génériques
← Retour à C# Academy