Contraintes génériques : différencier les valeurs et les références
En C#, les contraintes génériques peuvent être utilisées pour appliquer des exigences spécifiques sur les paramètres de type. Ceci est particulièrement utile pour faire la distinction entre les types valeur, les types valeur nullable et les types référence.
Contraintes pour les types valeur et valeur nullable
Considérez le code suivant, qui différencie entre les types de valeur simple et les types de valeur nullables :
static void Foo<T>(T a) where T : struct { } // Plain value type (e.g. int) static void Foo<T>(T? a) where T : struct { } // Nullable value type (e.g. int?)
Contraintes de référence Types
Cependant, tenter de définir une contrainte pour les types de référence en utilisant la classe Where T : entraîne une erreur du compilateur. En effet, les contraintes sont appliquées lors de la résolution de la surcharge et les paramètres ont priorité sur les contraintes.
Pour résoudre ce problème, la contrainte peut être placée dans un paramètre, quoique de manière moins élégante :
class RequireStruct<T> where T : struct { } class RequireClass<T> where T : class { } static void Foo<T>(T a, RequireStruct<T> ignore = null) where T : struct { } // Plain value type static void Foo<T>(T? a) where T : struct { } // Nullable value type static void Foo<T>(T a, RequireClass<T> ignore = null) where T : class { } // Reference type
En plaçant la contrainte dans le paramètre facultatif ignorer, le compilateur peut distinguer les différents cas sans entrer en conflit avec les types de paramètres. Cela permet le mappage prévu des types de référence à la surcharge de fonction correcte.
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!