also eine recht häufige Erweiterungsmethode für IEnumerable, Run:Warum funktioniert die Überladungsauflösung von C# nicht zwischen Func <T,T> und 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;
}
}
Wenn ich versuche, das zu verwenden, mit zum Beispiel DbSet.Add:
invoice.Items.Run(db.InvoiceItems.Add);
// NB: Add method signature is
// public T Add(T item) { ... }
... der Compiler beschwert mich, dass Es hat den falschen Rückgabetyp, weil es eine ungültige Methode erwartet. So fügen Sie eine Überlastung für Run, die eine Func statt Aktion nimmt:
public static IEnumerable<T> Run<T>(this IEnumerable<T> source, Func<T, T> action)
{
return source.Select(action).ToList().AsEnumerable();
}
Und nun der Compiler beschwert sich, dass „Der Anruf zwischen den folgenden Methoden nicht eindeutig ist ...“
Also meine Frage ist, Wie kann die Action-Überladung der Run-Methode zu Mehrdeutigkeiten führen, wenn sie für die Methodengruppe nicht gültig ist?
Was ist die Signatur von 'db.InvoiceItems.Add'? – leppie
public T Add (T item) {...} –
Kurze Antwort: 'x => x.ToString()' Soll dieser Lambda einfach ToString aufrufen oder ToString aufrufen und sein Ergebnis zurückgeben?Mit anderen Worten, sollte dieses Lambda wie eine Funktion oder eine Aktion behandelt werden? Der Compiler kann diese Entscheidung nicht für Sie treffen, daher ein Fehler. – Polity