Gần đây tôi đã gặp sự cố khi cố gắng AddRange (IEnumerable) vào Danh sách. Có lẽ là một vấn đề cổ điển, nhưng tôi chưa thực sự hiểu nó.C# Không thể chuyển đổi từ IEnumerable <Base> thành IEnumerable <Derived>
Tôi hiểu rằng các phương pháp mong đợi tham số Danh sách không hài lòng với Danh sách, vì chúng có thể cố thêm một Cơ sở vào Danh sách, điều này rõ ràng là không thể.
Nhưng nếu tôi nhận được điều này một cách chính xác, vì IEnumerables tự mình không thể thay đổi, nó nên làm việc trong trường hợp này.
Mã i nghĩ đến ngoại hình như thế này:
class Foo
{
}
class Bar : Foo
{
}
class FooCol
{
private List<Foo> m_Foos = new List<Foo>();
public void AddRange1(IEnumerable<Foo> foos)
{
m_Foos.AddRange (foos); // does work
}
public void AddRange2<T>(IEnumerable<T> foos) where T : Foo
{
m_Foos.AddRange (foos); // does not work
}
}
class Program
{
static void Main(string[] args)
{
FooCol fooCol = new FooCol();
List<Foo> foos = new List<Foo>();
List<Bar> bars = new List<Bar>();
fooCol.AddRange1 (foos); // does work
fooCol.AddRange1 (bars); // does not work
fooCol.AddRange2 (foos); // does work
fooCol.AddRange2 (bars); // does work
}
}
tôi đã cố gắng để vượt qua một gợi ý để trình biên dịch trong phương pháp AddRange2, nhưng điều này chỉ chuyển đến vấn đề xung quanh.
Cách suy nghĩ của tôi có thiếu sót không? Đây có phải là giới hạn của ngôn ngữ hay là do thiết kế?
IIRC, hỗ trợ cho loại hoạt động này đã được thêm vào Java 1.5, vì vậy có thể nó sẽ được thêm vào C# tại một số điểm trong tương lai, quá ...?
Sao y các câu hỏi khác nhau, bao gồm http://stackoverflow.com/questions/632399 –
Thực tế, tôi xin lỗi. Google-jutsu của tôi vẫn cần cải thiện. – mafu
Không sao cả. Nó sẽ là tốt đẹp để có một câu hỏi thường gặp cho mỗi thẻ, IMO ... –