J'ai la structure de classe suivante:.net 4 génériques question
public class A : AInterface { }
public interface AInterface { }
public class B<T> : BInterface<T> where T : AInterface
{
public T Element { get; set; }
}
public interface BInterface<T> where T : AInterface
{
T Element { get; set; }
}
public class Y : B<A> { }
public class Z<T> where T : BInterface<AInterface> {}
public class Test
{
public Test()
{
Z<Y> z = new Z<Y>();
}
}
Cela me donne les éléments suivants dans la compilation erorr C# 4.0. Le type 'Test.Y' ne peut pas être utilisé comme paramètre de type 'T' dans le type générique ou la méthode 'Test.Z'. Il n'y a pas de conversion de référence implicite de 'Test.Y' à 'Test.BInterface'.
Je pense que la covariance dans les génériques devrait faire ce travail? Toute aide serait appréciée.
Merci Alexandra. Cela aiderait certainement si T est un paramètre de retour. Dans mon cas, je l'ai manqué un détail important dans le B et BInterface: public class B: BInterface où T: AInterface { publique T Element {get; ensemble; } } interface publique BInterface où T: AInterface { T Elément {get; ensemble; } } ne fonctionnera pas puisque T est à la fois dedans et dehors. Aucune suggestion? –
roger
Oui, si vous avez une contrainte générique sur un paramètre de type, vous ne pouvez pas le rendre covariant. C'est par conception. http://msdn.microsoft.com/en-us/library/dd469487(VS.100).aspx "Dans une interface générique, un paramètre de type peut être déclaré covariant s'il satisfait aux conditions suivantes: 1) Le paramètre type est utilisé uniquement comme type de retour des méthodes d'interface et non utilisé comme type d'arguments de méthode 2) Le paramètre type n'est pas utilisé comme contrainte générique pour les méthodes d'interface. " –