Contraintes génériques : Distinguer les types valeur et référence
Introduction
En programmation générique, les contraintes nous permettent de spécifier des restrictions sur les paramètres de type. Un problème courant consiste à faire la différence entre les types valeur (par exemple, les entiers) et les types référence (par exemple, les chaînes). Cette question explore un cas où les contraintes sur les paramètres de type ne se résolvaient pas comme prévu.
Le problème
L'auteur a posé le défi de faire la distinction entre différents scénarios de type valeur : simple types de valeur (int), types de valeur nullables (int?) et types de référence (string). Initialement, ils ont proposé d'utiliser Where T : struct pour identifier les types de structure (types de valeur) et Where T : class pour identifier les types de référence, mais cela a entraîné une erreur de compilation en raison de définitions de membres en double.
Le Solution
L'idée clé est que les contraintes ne font pas partie de la signature de la méthode et que la résolution des surcharges prend en compte les types de paramètres. Ainsi, l'auteur a placé la contrainte dans un paramètre pour différencier les types valeur et référence. Voici le code révisé :
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
En utilisant ces classes d'assistance, le code fait désormais correctement la distinction entre les différents scénarios de type valeur. Foo(z) sera compilé et mappé à la méthode (3), car la chaîne est un type de référence.
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!