Как я могу сделать следующий код работы? Я не думаю, что я вполне понимаю C# generics. Возможно, кто-то может указать мне в правильном направлении.Как создать общий класс с наследованием?
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# 3.0, но это возможно в C# 4.0.
Чтобы получить это работает в C# 3.0, который просто обходной путь до 4.0, используйте следующее:
// Compiler is happy
List<A> listB = new List<B>().OfType<A>().ToList();
// Compiler is happy
List<A> listC = GetCList().OfType<A>().ToList();
На самом деле это не характерно для дженериков, но ответ Спенса примерно так же хорош, как и вы. C# 4.0 добавит «утиную печать», где вы можете уйти от такого рода вещей. – womp
Это неверно. Мы НЕ добавляем утиную печать, а ковариация и контравариантность применимы только к интерфейсам; Список - это класс. –