Tôi đã chiến đấu thông qua hiệp phương sai và đối nghịch trong một vài ngày và tôi nghĩ rằng tôi đã hiểu điều gì đó nhưng tôi hy vọng rằng tôi có thể nhận được xác nhận về điều này vì tôi không thể nhận được câu trả lời có hoặc không thông qua hiện tại của mình nghiên cứu. Tôi có hệ thống phân cấp lớp sau:Vui lòng hỗ trợ xác nhận xem sự hiểu biết của tôi về hiệp phương sai ở đây có đúng không?
class Shape
{
public string Name { get; set; }
}
class Square : Shape
{
}
Sau đó, đây là những gì tôi những gì tôi đang bắt đầu chương trình với:
List<Square> squares = new List<Square>() { new Square { Name = "Square One" }, new Square { Name = "Square Two" } };
IEnumerable<Square> squaresEnum = squares;
Bây giờ là hai câu hỏi tôi có:
Sản phẩm sau có thể vì IEnumerable < T> IS covariant:
IEnumerable<Shape> shapesEnumerable = squares;
AND, là f ollowing KHÔNG thể vì Danh sách < T> là KHÔNG hiệp biến:
List<Shape> shapes = squares;
Đây là mã chương trình đầy đủ nếu nó là cần thiết cho bất cứ điều gì:
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
{
}
Xin bạn có thể cho tôi biết nếu tôi đang trên theo dõi đúng với điều này?
Có; đúng rồi. – SLaks
@SLaks Cảm ơn bạn rất nhiều! – macmatthew