Réponse courte: Non, il n'y a aucun moyen. Réponse longue: Non, il n'y a aucun moyen ni dans C# 3.0 ni C# 4.0, parce que la co-et contravariance n'est pas supportée dans C# 3.0 du tout et seulement sur les types de délégués et les interfaces dans C# 4.0.
MISE À JOUR:
Si vous souhaitez enregistrer plusieurs instances de cette classe dans une liste, indépendamment du type concret de T
, une solution de contournement pourrait ressembler à ceci:
Créer une interface ITest
qui utilise partout Base
vous utiliserait T
. Rendre Test<T>
implémenter cette interface et masquer les méthodes de ITest
en utilisant l'implémentation d'interface explicite. Utilisez ITest
comme type de paramètre pour votre méthode. Exemple de code:
class Base
{
public int Info { get; set; }
}
class Derived : Base
{
public int Info2 { get; set; }
}
interface ITest
{
Base Data { get; set; }
}
class Test<T> : ITest
where T : Base
{
public T Data { get { return (T) (((ITest) this).Data); } set { ((ITest) this).Data = value; } }
Base ITest.Data { get; set; }
}
List<ITest> list = new List<ITest>();
list.Add(new Test<Base>());
list.Add(new Test<Derived>());
Si vous voulez juste passer cette classe à une méthode sans nécessiter une T
spécifique, vous pouvez rendre votre méthode générique ainsi:
void YourMethod<T>(Test<T> test) where T : Base
{
Console.WriteLine(test.Data.Info);
}
YourMethod(new Test<Base>());
YourMethod(new Test<Derived>());
Que voulez-vous dire par type de délégué? Pouvez-vous élaborer pour C# 4.0 s'il vous plaît? – Twinhelix
S'il vous plaît lire ici sur ce sujet: http://blogs.msdn.com/b/csharpfaq/archive/2010/02/16/covariance-and-contravariance-faq.aspx –
Aussi cette réponse explique pourquoi les classes ne sont pas co - ou contravariant http://stackoverflow.com/questions/2733346/why-isnt-there-generic-variance-for-classes-in-c-4-0/2734070#2734070 –