Quindi, un metodo abbastanza comune estensione per IEnumerable, Run:Perché la risoluzione di sovraccarico di C# non funziona tra Func <T,T> e 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;
}
}
Quando provo ad usare quella con, ad esempio, DbSet.Add:
invoice.Items.Run(db.InvoiceItems.Add);
// NB: Add method signature is
// public T Add(T item) { ... }
... il compilatore si lamenta che ha il tipo di ritorno sbagliato, perché si aspetta un metodo di annullamento. Quindi, aggiungere un sovraccarico per Run che prende una Funz invece di Azione:
public static IEnumerable<T> Run<T>(this IEnumerable<T> source, Func<T, T> action)
{
return source.Select(action).ToList().AsEnumerable();
}
E ora il compilatore si lamenta che "La chiamata è ambigua tra i seguenti metodi ..."
Quindi la mia domanda è, in che modo l'overload di Action del metodo Run può causare ambiguità quando non è valido per il gruppo di metodi?
Qual è la firma di 'db.InvoiceItems.Add'? – leppie
pubblico T Aggiungi (elemento T) {...} –
Risposta breve: 'x => x.ToString()' questo lambda deve semplicemente richiamare ToString o invocare ToString e restituire il risultato?In altre parole, questo lambda dovrebbe essere gestito come una funzione o un'azione? Il compilatore non può prendere questa decisione per te quindi quindi un errore. – Polity