Vì vậy, một phương pháp khá phổ biến mở rộng cho IEnumerable, Run:Tại sao độ phân giải quá tải của C# không hoạt động giữa Func <T,T> và Hành động <T>?
public static IEnumerable<T> Run<T>(this IEnumerable<T> source, Action<T> action)
{
foreach (var item in source)
{
action(item);
yield return item;
}
}
Khi tôi cố gắng sử dụng với, ví dụ, DbSet.Add:
invoice.Items.Run(db.InvoiceItems.Add);
// NB: Add method signature is
// public T Add(T item) { ... }
... trình biên dịch phàn nàn rằng nó có kiểu trả về sai, vì nó đang mong đợi một phương thức void. Vì vậy, thêm một tình trạng quá tải cho Run mà phải mất một Func thay vì hành động:
public static IEnumerable<T> Run<T>(this IEnumerable<T> source, Func<T, T> action)
{
return source.Select(action).ToList().AsEnumerable();
}
Và bây giờ trình biên dịch phàn nàn rằng "Cuộc gọi là mơ hồ giữa các phương pháp sau ..."
Vì vậy, câu hỏi của tôi là, làm thế nào có thể hành động quá tải của phương pháp Run gây ra sự mơ hồ khi nó không hợp lệ cho nhóm phương pháp?
Chữ ký của 'db.InvoiceItems.Add' là gì? – leppie
T công cộng Thêm (T mục) {...} –
Câu trả lời ngắn: 'x => x.ToString()' lambda này đơn giản nên gọi ToString hoặc gọi ToString và trả về kết quả của nó?Nói cách khác, lambda này có nên được xử lý như một func hay một hành động không? Trình biên dịch không thể đưa ra quyết định này cho bạn do đó, do đó có lỗi. – Polity