Tôi có một thói quenC# .NET đi qua một bộ sưu tập của các đối tượng InterfaceImplementingClass để một thói quen mà phải mất một tập hợp các giao diện đối tượng
public void SomeRoutine(List<IFormattable> list) { ... }
sau đó tôi cố gắng gọi thói quen
List<Guid>list = new List<Guid>();
list.Add(Guid.NewGuid());
SomeRoutine(list);
này Và nó không thành công với một lỗi biên dịch thời gian. System.Guid thực hiện IFormattable, nhưng lỗi tôi nhận được là
không thể chuyển đổi từ 'System.Collections.Generic.List' để 'System.Collections.Generic.List'
LƯU Ý : Bạn sẽ nhận được cùng một lỗi nếu bạn chỉ sử dụng một loạt các hướng dẫn. Generics KHÔNG phải là nguyên nhân ....
Nhưng! Với này
public void SomeRoutine2(IFormattable obj) { ... }
và điều này
Guid a = Guid.NewGuid();
SomeRoutine2(a);
Nó biên dịch! Vì vậy, câu hỏi là TẠI SAO? Tại sao tôi có thể truyền một đối tượng Guid (thực hiện IFormattable) thành một thường trình chấp nhận một đối tượng IFormattable, nhưng khi tôi cố gắng mở rộng một bộ sưu tập (một danh sách chung hoặc một mảng hoặc bất kỳ thứ gì khác), tôi nhận được một lỗi chuyển đổi?
Tôi đã có một thời gian tìm kiếm câu trả lời và tôi đã nhận ra đây là nơi tốt nhất để đi.
Bạn nhận ra rằng câu trả lời được đánh dấu (.NET 4.0 covariance) không thực sự áp dụng cho các danh sách, nơi mà như generics hoạt động * bây giờ *? –
Xem thêm: http://marcgravell.blogspot.com/2009/02/what-c-40-covariance-doesn-do.html –
Ngoại trừ việc nó không hoạt động với một loạt các Hướng dẫn có thói quen đang tìm kiếm một mảng của IFormattable, hoặc là ....? – emkayultra