Die Func
Familie von Delegierten (oder Action
was das betrifft) sind nichts anderes als einfache Delegattypen erklärt wie
//.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. Die Delegierten als solche kann out/ref Parameter haben, so in Ihrem Fall ist es nur eine Frage der benutzerdefinierten Umsetzung von Ihnen selbst, wie andere Antworten darauf hingewiesen haben. Warum Microsoft das nicht standardmäßig gepatcht hat, denken Sie an die schiere Anzahl der Kombinationen, die es erfordern würde.
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.
Falls jemand anders wie ich verwirrt ist, müssen Sie Ihren Delegierten nicht "Func" nennen, wie die eingebauten ... – Dunc
@Dunc - Fixed. Ich wäre wirklich verwirrt gewesen, wäre da nicht Ihr Kommentar. –
In C# 4 (2010) und später (wurde nicht veröffentlicht, als Sie Ihre Antwort geschrieben haben) ist es möglich, 'T' als kontravariante und' V' als kovariante zu markieren. Da jedoch ein Parameter ("output") vom Typ "U" durch *** *** übergeben wird, kann "U" nicht als co- oder kontravariant markiert werden und muss "invariant" bleiben. Betrachte also 'public delegate V MyDelegate (T input, out U output); 'wenn du C# 4 oder höher benutzt. –