Donc, dans une question précédente, j'ai posé des questions sur la mise en œuvre d'une interface générique avec une classe publique et un bingo, cela fonctionne. Cependant, l'un des types que je cherche à passer est l'un des types nullables intégrés tels que: INT, GUID, String, etc.
Voici mon interface: P>
public class TestInterface : IOurTemplate<MyCustomClass, Int32> { public IEnumerable<MyCustomClass> List() { throw new NotImplementedException(); } public MyCustomClass Get(Int32 testID) { throw new NotImplementedException(); } }
3 Réponses :
types nullables ne satisfait pas La contrainte de type de référence Spécifie qu'un argument de type utilisé pour le paramètre type doit être un type de référence. Tous les types de classe, types d'interfaces, types de délégués, types de réseau et paramètres de type connus pour être un type de référence (tel que défini ci-dessous) satisfaire à cette contrainte.
La contrainte de type de valeur Spécifie qu'un argument de type utilisé pour le paramètre type doit être un type de valeur non nullable. p>
Tous les types de structure non nullables, types d'énumjets et paramètres de type ayant la contrainte de type de valeur répondent à cette contrainte. Notez que, bien que classé comme type de valeur, un type nullable (§4.1.10) ne satisfasse pas la contrainte de type de valeur. strong> Un paramètre de type ayant la contrainte de type de valeur ne peut également avoir la contrainte de constructeur. < / p>
blockQuote> Classe code> ou
struct code> contraintes: p>
C # Spécification de langue V3.0 (section §10.1.5: Type des contraintes de paramètre): h3>
Alors, quelle est votre recommandation?
Si vous n'avez pas besoin de contraintes, supprimez-les. Si vous souhaitez utiliser des types nullables uniquement, ajoutez une contrainte de type de valeur ( où T: struct code>) et utilisez
t? Code> dans la définition de la classe.
Quel est le point d'avoir une telle règle? Sûrement nullable
@buffjape Eh bien, c'est une structure spéciale et ne satisfait pas la contrainte. NULLLABLE
nullable
t code > struct, pas
nullable
null code> valeur nullable est en boîte, il renvoie simplement une référence null. La justification est: imaginez
int? a = null; si (a == null) {...} objet o = a; Si (O == NULL) {...} code>, vous voulez probablement tous les deux
si code> Les corps doivent être exécutés de manière constante. En fait, en début de bêtres de .NET 2.0 qui introduisait des types nullables,
nullable
? Code> était juste une syntaxe ...
... sucre pour manipuler nullable
nullable
myscullable
Ils ont donc mis en œuvre nullable
Je ne ferais pas vraiment cela, mais c'est probablement le seul moyen de le faire fonctionner.
Une raison pour laquelle vous devez limiter le type U à la classe?
public interface IOurTemplate<T, U> where T : class { IEnumerable<T> List(); T Get(U id); } public class TestInterface : IOurTemplate<MyCustomClass, Int32?> { public IEnumerable<MyCustomClass> List() { throw new NotImplementedException(); } public MyCustomClass Get(Int32? testID) { throw new NotImplementedException(); } }