Lorsqu'il s'agit de types génériques, il est souvent nécessaire de faire la différence entre les types de valeur, les types de valeur nullables et les types de référence. Considérez le code suivant :
static void Foo<T>(T a) where T : struct { } // 1 static void Foo<T>(T? a) where T : struct { } // 2
Ce code gère avec succès les types de valeur (1) et les types de valeur nullables (2). Cependant, tenter de détecter les types de référence (3) à l'aide de la contrainte suivante ne compile pas :
static void Foo<T>(T a) where T : class { } // 3
Le message d'erreur indique qu'un membre avec la même signature existe déjà. Ce problème se pose car les contraintes ne font pas partie de la signature, contrairement aux paramètres. Pour résoudre cela, on peut placer la contrainte dans un paramètre :
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 { } // 1 static void Foo<T>(T? a) where T : struct { } // 2 static void Foo<T>(T a, RequireClass<T> ignore = null) where T : class { } // 3
Cette approche permet de différencier les trois cas.
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!