Die Prämisse ist falsch; es funktioniert gut:
Func<int> func = delegate { Console.WriteLine("first part"); return 5; };
func += delegate { Console.WriteLine("second part"); return 7; };
int result = func();
Das ist ein Multicast-Delegat mit einem non-void-Ergebnis, funktioniert gut. Sie können von der Konsole aus sehen, dass beide Teile ausgeführt wurden. Das Ergebnis des letzten Elements ist das zurückgegebene. Wir können zeigen, dass dies eine wahre Multicastdelegat ist:
if(func is MulticastDelegate) Console.WriteLine("I'm multicast");
und es wird schreiben: „Ich bin Multicast“ schon nach der ersten Zeile (wenn es nur eine einzige Methode aufgeführt).
Wenn Sie mehr Kontrolle über die einzelnen Ergebnisse benötigen, dann GetInvocationList()
verwenden:
foreach (Func<int> part in func.GetInvocationList())
{
int result = part();
}
, die Sie jedes einzelne Ergebnis sehen können.
In IL Terminologie:
.class public auto ansi sealed Func<+ TResult>
extends System.MulticastDelegate`
das heißt: Func<T>
erbt von MulticastDelegate
. Grundsätzlich sind Delegaten in .NET in allen Fällen Multicast-Delegaten. Sie möglicherweise in der Lage sein, einen nicht-Multicast-Delegaten in verwaltetem C++ zu bekommen, weiß ich nicht. Aber sicher nicht von C#.
Können Sie ein Beispiel dafür angeben, wo eine Ausnahme ausgelöst wird? –