Với ví dụ LinqPad sau:Tại sao IEnumerable không cần một dàn diễn viên nhưng Danh sách có?
void Main()
{
List<DbItem> dbItems = new List<DbItem>
{
new DbItem{Id = 4, SomeValue = "Value For 4", OtherValue = 1},
new DbItem{Id = 19, SomeValue = "Value For 19", OtherValue = 2}
};
ListMethod(dbItems.Cast<IDbItem>().ToList()); <-+
EnumerableMethod(dbItems); <-+
} |
|
// These are the methods are I asking about -------+
public void ListMethod(List<IDbItem> dbItems)
{
Console.WriteLine(dbItems);
}
public void EnumerableMethod(IEnumerable<IDbItem> dbItems)
{
Console.WriteLine(dbItems);
}
public class DbItem : IDbItem
{
public int Id {get; set;}
public string SomeValue {get; set;}
public int OtherValue {get; set;}
}
public interface IDbItem
{
int Id {get; set;}
string SomeValue {get; set;}
}
Tại sao có thể EnumerableMethod
mất danh sách trực tiếp trong khi ListMethod
cần một dàn diễn viên đầu tiên?
Tôi nhận được rằng một diễn viên đang diễn ra từ DbItem đến IDbItem, nhưng điều gì khác biệt về IEnumerable cho phép nó tạo diễn viên mà không có yêu cầu rõ ràng?
Tôi tưởng tượng câu trả lời liên quan đến từ hiệp phương sai, nhưng tôi không biết đủ về điều đó để tự tìm ra.
Tôi nhận được rằng một con chó thực sự là một danh sách các con chó và không động vật. Nhưng sau đó tại sao nó làm việc cho IEnumerable? – Vaccano
'IEnumerable' không có phương thức' Add', do đó không sợ thêm 'Cat' vào' dogs'. Hiệp phương sai là một cái gì đó phải được xác định rõ ràng, và những kẻ tạo ra 'Danh sách' quyết định rằng nó không nên là biến đổi cho lý do trên. Những kẻ đã tạo ra 'IEnumerable' đã quyết định rằng nó phải là một biến thể. – ShadowCat7