因此,对于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时,例如: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方法对于该方法组无效时,如何使其造成歧义?
db.InvoiceItems.Add
的签名是什么? - leppiex => x.ToString()
这个 lambda 表达式应该只是调用 ToString 方法还是调用 ToString 方法并返回其结果?换句话说,这个 lambda 表达式应该被处理为一个 func 还是一个 action?编译器无法为您做出这个决定,因此会出现错误。 - Politysomething
的方法更改为返回void
的委托。 - svick