2010-11-22 5 views

Répondre

4

Ceci n'est pas possible. cf §10.1.5 de la spécification C#. En particulier, la grammaire indique très clairement que cela n'est pas possible.

type-parameter-constraints-clauses: 
    type-parameter-constraints-clause 
    type-parameter-constraints-clauses type-parameter-constraints-clause 
type-parameter-constraints-clause: 
    where type-parameter : type-parameter-constraints 
type-parameter-constraints: 
    primary-constraint 
    secondary-constraints 
    constructor-constraint 
    primary-constraint , secondary-constraints 
    primary-constraint , constructor-constraint 
    secondary-constraints , constructor-constraint 
    primary-constraint , secondary-constraints , constructor-constraint 
primary-constraint: 
    class-type 
    class 
    struct 
secondary-constraints: 
    interface-type 
    type-parameter 
    secondary-constraints , interface-type 
    secondary-constraints , type-parameter 
constructor-constraint 
    new ( ) 

Vous pouvez avoir une clause de garde dans le corps de la méthode:

Contract.Requires<InvalidOperationException>(!typeof(T).IsAbstract); 
+0

Merci, ça aide! Y a-t-il une raison pour que cela ne soit pas supporté dans la grammaire? – Remus

0

Une déclaration de type générique génère un type d'exécution par argument T créé à partir du type générique (je pense) lors de la première instanciation . Comme une classe abstraite par définition ne peut pas être instanciée, ces deux principes contredisent directement.