Por lo tanto, un método bastante común para la extensión IEnumerable, Run:¿Por qué la resolución de sobrecarga de C# no funciona entre Func <T,T> y Acción <T>?
public static IEnumerable<T> Run<T>(this IEnumerable<T> source, Action<T> action)
{
foreach (var item in source)
{
action(item);
yield return item;
}
}
Cuando trato de usar que con, por ejemplo, DbSet.Add:
invoice.Items.Run(db.InvoiceItems.Add);
// NB: Add method signature is
// public T Add(T item) { ... }
... el compilador se queja de que tiene el tipo de devolución incorrecto, porque está esperando un método vacío. Por lo tanto, añadir una sobrecarga de ejecución que toma un Func lugar de acción:
public static IEnumerable<T> Run<T>(this IEnumerable<T> source, Func<T, T> action)
{
return source.Select(action).ToList().AsEnumerable();
}
Y ahora el compilador se queja de que "La llamada es ambigua entre los métodos siguientes ..."
Así que mi pregunta es, ¿Cómo puede la sobrecarga de acción del método Run causar ambigüedad cuando no es válida para el grupo de métodos?
¿Cuál es la firma de 'db.InvoiceItems.Add'? – leppie
public T Add (elemento T) {...} –
Respuesta corta: 'x => x.ToString()' ¿debería esta lambda simplemente invocar ToString o invocar ToString y devolver su resultado?En otras palabras, ¿se debería manejar esta lambda como un func o una acción? El compilador no puede tomar esta decisión por ti y, por lo tanto, un error. – Polity