2009-11-13 6 views
4

Désolé pour poser question stupideexclusion de contrainte générique

Est-il possible d'appliquer la contrainte sur générique de telle sorte que le T donné peut être dérivé de tout type de référence, sauf certains A, B, C (où A, B, C sont des types de référence). (i.e.)

Where T : class except A,B,C 
+4

Peut-être que cela vous aiderait si vous expliquiez ce que vous voulez utiliser pour cela. –

+0

@Joel Après avoir fait la correction de bit, je vais poster mon code et expliquer pourquoi j'en ai besoin. Merci Joel. – user196546

+0

@ user196546 une mise à jour? –

Répondre

5

Non, mais vous pouvez vérifier ces cours lors de l'exécution:

public class Foo<T> 
{ 
    static Foo() 
    { 
     // one of the following depending on what you're trying to do 
     if (typeof(A).IsAssignableFrom(typeof(T))) 
     { 
      throw new NotSupportedException(string.Format(
       "Generic type Foo<T> cannot be instantiated with {0} because it derives from or implements {1}.", 
       typeof(T), 
       typeof(A) 
       )); 
     } 

     if (typeof(T) == typeof(A)) 
     { 
      throw new NotSupportedException(string.Format(
       "Generic type Foo<T> cannot be instantiated with type {0}.", 
       typeof(A) 
       )); 
     } 
    } 
} 
+2

Si vous déplacez la vérification vers un constructeur statique, elle ne s'exécute qu'une fois au lieu de chaque fois qu'une nouvelle instance de la classe est créée. Cependant, en raison de problèmes de débogage, il est très important d'inclure un message d'erreur correct avec 'NotSupportedException' dans ce cas. J'ai modifié le message pour utiliser cette méthode. –

3

Non, vous ne pouvez spécifier qu'il ne hérite d'un type particulier, est une valeur ou un type de référence, ou qu'il doit avoir un constructeur par défaut. Rappelez-vous que c'est pour le bénéfice du compilateur, pas du développeur. :)

Le mieux que vous puissiez probablement faire est de lancer une exception lors de l'exécution.

1

No. Désolé, vous pouvez savoir comment vous pouvez contraindre here ...

0

Non, il n'y a pas de négation des types. La clause where vous permet seulement de contraindre à un type spécifique.

Questions connexes