Hello à tous,

je suis face à un truc que je comprend pas :

J'ai une classe mère abstraite et deux classes filles qui possèdent les deux une collection generique dont le type possède une contrainte. La classe mère comprend egalement une methode abstraite de creation de cette collection. Ce sont les classes filles qui implementent la construction de la collection generique.

la classe mère avec son constructeur protegé et la definition de la methode
de creation de la coll. générique.

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
public abstract class CSide : ISide
{
       protected CSide()
       {
            this.CreateLink();        
       }
       protected abstract void CreateLink();
}
les classes filles (leur seules differences est le type de la collection generique.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
 
public class CLeft : CSide , ILeft
{
    public ILink<ILeft> Link { get; private set; }
    public CLeft() : base(){}
    protected override void CreateLink()
    {
        Link = new CLink<ILeft>();
    }  
}
 
public class CRight: CSide , IRight
{
    public ILink<IRight> Link { get; private set; }
    public CRight() : base(){}
    protected override void CreateLink()
    {
        Link = new CLink<IRight>();
    }  
}
{
et enfin le type de la collection generique
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
 
public class CLink<T> : ILink<T> where T: ISide
{   
    private readonly HashSet<T> m_Connectors;
 
    public CLink()      
    {
        m_Connectors = new HashSet<T>();            
    } 
}

Toute cette petite machinerie fonctionnait parfaitement avant que je extrait la contrainte de CLink dans ILink. Depuis cette instant, j ai une erreur :
Test method VerifyFunctionTest threw exception: System.TypeLoadException: GenericArguments[0], T, pour ILink`1[T]' ne respecte pas la contrainte du paramètre de type T..
L'interface qui posse problème
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
 
public interface ILink<T> : ILink where T: ISide
{    
    ICollection<T> Connectors { get; }    
}
Et au debug, plus moyen d'entrée dans les fonctions "CreateLink()" de creation implmenté dans les classes filles (polymorphisme). J' ai verifié, le type de l'objet est bien un de type fille.
Si je laisse la contrainte uniquequement sur la classe et par sur l'interface, tout marche correctement.