Kann ich eine Methode mit einem out-Parameter als Func übergeben?
public IList<Foo> FindForBar(string bar, out int count) { }
// somewhere else
public IList<T> Find(Func<string, int, List<T>> listFunction) { }
Func benötigt einen Typ, damit out dort nicht kompiliert wird, und der Aufruf von listFunction erfordert ein int und erlaubt kein out in.
Gibt es eine Möglichkeit, dies zu tun?
T
als kontravariante undV
als kovariante zu markieren . Da jedoch ein Parameter (output
) vom TypU
als Referenz übergeben wird ,U
kann er nicht als co- oder kontravariant markiert werden und muss "invariant" bleiben. Überlegenpublic delegate V MyDelegate<in T, U, out V>(T input, out U output);
Sie also, ob Sie C # 4 oder höher verwenden.ref
Parametern mitin
undout
Parametern .Warum nicht eine Klasse erstellen, um die Ergebnisse zu kapseln?
quelle
Die
Func
Familie der Delegierten (oder auch nurAction
) sind nichts anderes als einfache Delegiertypen, die wie folgt deklariert sindusw. Delegierte als solche können out / ref-Parameter haben. In Ihrem Fall handelt es sich also nur um eine benutzerdefinierte Implementierung durch Sie selbst, wie andere Antworten gezeigt haben. Überlegen Sie sich, warum Microsoft dies nicht standardmäßig verpackt hat, wie viele Kombinationen erforderlich sind.
für nur zwei Parameter. Wir haben nicht einmal berührt
ref
. Es wäre für Entwickler tatsächlich umständlich und verwirrend.quelle
delegate TResult Func<T1, T2, TResult>(T1 obj, T2 obj)
und unterscheiden kanndelegate TResult Func<T1, T2, TResult>(out T1 obj, T2 obj)
. Neben der Anzahl der Überladungen sind Symbolnamen ein weiterer Grund, warum Microsoft diese Überladungen von nicht hinzufügen konnteFunc
.Sie könnten es in ein Lambda / Delegate / Funktion / Methode einbinden, das die richtige Schnittstelle und den Namen FindForBar verfügbar macht, aber ich vermute, dass FindForBar als Grund als out-Parameter gezählt hat, sodass Sie sicher sein müssen, dass diese Informationen weggeworfen wurden ok / sicher / wünschenswert / hatte die richtigen Ergebnisse (Sie müssten sich dessen sicher sein, auch wenn Sie FindForBar direkt übergeben könnten).
quelle