Die Func
Familie der Delegierten (oder auch nur Action
) sind nichts anderes als einfache Delegiertypen, die wie folgt deklariert sind
//.NET 4 and above
public delegate TResult Func<out TResult>()
public delegate TResult Func<in T, out TResult>(T obj)
//.NET 3.5
public delegate TResult Func<T1, T2, TResult>(T1 obj1, T2 obj2)
public delegate TResult Func<T1, T2, T3, TResult>(T1 obj1, T2 obj2, T3 obj3)
usw. 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.
delegate TResult Func<T1, T2, TResult>(T1 obj1, T2 obj2)
delegate TResult Func<T1, T2, TResult>(out T1 obj1, T2 obj2)
delegate TResult Func<T1, T2, TResult>(T1 obj1, out T2 obj2)
delegate TResult Func<T1, T2, TResult>(out T1 obj1, out T2 obj2)
für nur zwei Parameter. Wir haben nicht einmal berührt ref
. Es wäre für Entwickler tatsächlich umständlich und verwirrend.
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.