Итак, довольно распространенный метод расширения для IEnumerable, Run:
public static IEnumerable<T> Run<T>(this IEnumerable<T> source, Action<T> action)
{
foreach (var item in source)
{
action(item);
yield return item;
}
}
Когда я пытаюсь использовать это, например, DbSet.Add:
invoice.Items.Run(db.InvoiceItems.Add);
// NB: Add method signature is
// public T Add(T item) { ... }
... компилятор жалуется, что у него неправильный тип возврата, потому что он ожидает метод void. Итак, добавьте перегрузку для Run, которая принимает Func вместо Action:
public static IEnumerable<T> Run<T>(this IEnumerable<T> source, Func<T, T> action)
{
return source.Select(action).ToList().AsEnumerable();
}
И теперь компилятор жалуется, что "вызов неоднозначен между следующими методами..."
Итак, мой вопрос: как может перегрузка Action метода Run вызвать неоднозначность, если она недопустима для группы методов?