2010-10-01 2 views
4

Je sais que je peux faire une méthode commeC# ne générique * pas * mettre en œuvre quelque chose

private T MyFun<T>() 
    where T : IMyInterface 
{...} 

Puis-je faire l'inverse, à savoir où T ne met pas en oeuvre IMyInterface? Le cas d'utilisation spécifique est que je ne veux pas autoriser les valeurs nulles, mais je suis curieux en général.

+0

Même si vous * pouvez * exclure une * interface * particulière (ou type de base), comment utiliseriez-vous cela pour exclure 'Nullable ' pour tout 'T'? Même avec cette fonctionnalité, vous ne pouvez pas faire cela. – Timwi

Répondre

0

Non, dans le cas général, vous ne pouvez pas spécifier une "liste d'exclusion". Toutefois, pour empêcher l'autorisation de types Nullable, vous pouvez utiliser la contrainte "where T: class". Parce que Nullable est une structure, cela aura l'effet désiré. Editer: Oups, il semble que j'étais trop hâtif - demandiez-vous comment empêcher tout ce qui peut être nul, ou spécifiquement Nullable, d'être autorisé?

+0

Supposons à des fins hypothétiques qu'il veut empêcher l'utilisation de 'Nullable '. Avec la contrainte 'T: class', vous avez exclu toutes les structures, et pas seulement' Nullable '. –

+0

True - comme indiqué, il n'existe pas de contrainte de "liste d'exclusion". C'est le seul moyen, avec des contraintes génériques, que je connaisse pour exclure Nullable . Certes, c'est loin d'être idéal - comme vous l'avez remarqué! – Ben

+0

Fait intéressant, la contrainte 'where T: struct' * exclut également' Nullable '. Donc, si l'OP sait avec certitude qu'il ne veut que des types de valeur ou des types de référence, l'un d'entre eux fonctionnera. –

2

Si vous ne voulez pas de types NULL, vous pouvez le faire.

private T MyFun<T>() 
    where T : struct 
{...} 
0

Vous pouvez toujours lancer une exception NotSupportedException() lors de l'exécution. Certes, pas aussi gentil que le compilateur l'empêche

Questions connexes