Comment puis-je faire fonctionner le code suivant? Je ne pense pas que je comprends tout à fait les génériques C#. Peut-être que quelqu'un peut me diriger dans la bonne direction.Comment faire une classe générique avec l'héritage?
public abstract class A
{
}
public class B : A
{
}
public class C : A
{
}
public static List<C> GetCList()
{
return new List<C>();
}
static void Main(string[] args)
{
List<A> listA = new List<A>();
listA.Add(new B());
listA.Add(new C());
// Compiler cannot implicitly convert
List<A> listB = new List<B>();
// Compiler cannot implicitly convert
List<A> listC = GetCList();
// However, copying each element is fine
// It has something to do with generics (I think)
List<B> listD = new List<B>();
foreach (B b in listD)
{
listB.Add(b);
}
}
C'est probablement une réponse simple.
Mise à jour: D'abord, cela n'est pas possible en C# 3.0, mais sera possible en C# 4.0.
Pour le faire fonctionner en C# 3.0, qui est juste une solution de contournement jusqu'à ce que 4.0, utilisez les touches suivantes:
// Compiler is happy
List<A> listB = new List<B>().OfType<A>().ToList();
// Compiler is happy
List<A> listC = GetCList().OfType<A>().ToList();
Ce n'est pas vraiment inhérent aux génériques, mais la réponse de Spence est à peu près aussi bonne que vous obtiendrez. C# 4.0 ajoutera "dactylographie", où vous pourrez vous en sortir avec ce genre de chose. – womp
Ceci est incorrect. Nous N'ajoutons PAS le typage du canard, et la covariance et la contravariance ne s'appliquent qu'aux interfaces; Liste est une classe. –