Walczyłem przez kowariancję i kontrrawariancję przez kilka dni i myślę, że zrozumiałem coś, ale miałem nadzieję, że mogę uzyskać potwierdzenie na tym, ponieważ nie byłem w stanie uzyskać odpowiedzi tak lub nie przez moje obecne Badania. Mam następujące klasy Hierarchia:Proszę pomóc w potwierdzeniu, czy moje rozumienie kowariancji tutaj jest poprawne?
class Shape
{
public string Name { get; set; }
}
class Square : Shape
{
}
Wtedy, to co ja, co Zacząłem program z:
List<Square> squares = new List<Square>() { new Square { Name = "Square One" }, new Square { Name = "Square Two" } };
IEnumerable<Square> squaresEnum = squares;
Teraz są dwa pytania mam:
jest następujący możliwe, ponieważ IEnumerable < T> IS kowariantna:
IEnumerable<Shape> shapesEnumerable = squares;
I, to f ollowing nie jest możliwe, ponieważ Lista < T> nie jest kowariantna:
List<Shape> shapes = squares;
Oto pełny kod programu, jeśli jest to wymagane do niczego:
class Program
{
static void Main(string[] args)
{
List<Square> squares = new List<Square>() { new Square { Name = "Square One" }, new Square { Name = "Square Two" } };
IEnumerable<Square> squaresEnum = squares;
/* Does this work because IEnumerable<T> is covariant? */
IEnumerable<Shape> shapesEnumerable = squares;
/* Does this NOT work because List<T> is NOT covariant */
//List<Shape> shapes = squares;
Console.ReadKey();
}
}
class Shape
{
public string Name { get; set; }
}
class Square : Shape
{
}
Proszę mógłbyś dać mi znać, jeśli jestem na właściwy tor z tym?
Tak; to jest poprawne. – SLaks
@SLaks Dziękuję bardzo! – macmatthew