Tak, to dość powszechna metoda rozszerzenie dla IEnumerable, Run:Dlaczego funkcja przeciążania C# nie działa między funkcjami <T,T> i Action <T>?
public static IEnumerable<T> Run<T>(this IEnumerable<T> source, Action<T> action)
{
foreach (var item in source)
{
action(item);
yield return item;
}
}
Kiedy próbuję użyć tego z, na przykład, DbSet.Add:
invoice.Items.Run(db.InvoiceItems.Add);
// NB: Add method signature is
// public T Add(T item) { ... }
... kompilator narzeka, że ma zły typ zwrotu, ponieważ oczekuje metody void. Więc dodać przeciążenie dla Run, które ma Func zamiast Działanie:
public static IEnumerable<T> Run<T>(this IEnumerable<T> source, Func<T, T> action)
{
return source.Select(action).ToList().AsEnumerable();
}
a teraz kompilator narzeka, że „Wywołanie jest niejednoznaczna między następujących metod ...”
więc moje pytanie brzmi, w jaki sposób przeciążenie akcji metodą Run może powodować niejednoznaczność, gdy nie jest poprawne dla grupy metod?
Co to jest podpis "db.InvoiceItems.Add"? – leppie
public T Dodaj (element T) {...} –
Krótka odpowiedź: 'x => x.ToString()' czy to lambda po prostu wywołuje ToString lub wywołuje ToString i zwraca jego wynik?Innymi słowy, czy ta lambda powinna być traktowana jako func czy akcja? Kompilator nie może podjąć tej decyzji, więc wystąpił błąd. – Polity