Przesłanka jest błędna; działa dobrze:
Func<int> func = delegate { Console.WriteLine("first part"); return 5; };
func += delegate { Console.WriteLine("second part"); return 7; };
int result = func();
To jest delegat multiemisji z niezerowym wynikiem, działa poprawnie. Z konsoli można zobaczyć, że obie części zostały wykonane. Wynik elementu last jest zwracany. Możemy wykazać, że jest to prawda, delegat multicast:
if(func is MulticastDelegate) Console.WriteLine("I'm multicast");
i będzie napisać „Jestem multicast” nawet już po pierwszym wierszu (gdy istnieje tylko jeden sposób na liście).
Jeśli potrzebujesz większej kontroli nad poszczególnymi wynikami, a następnie użyć GetInvocationList()
:
foreach (Func<int> part in func.GetInvocationList())
{
int result = part();
}
który pozwala zobaczyć każdy pojedynczy wynik.
W terminologii IL:
.class public auto ansi sealed Func<+ TResult>
extends System.MulticastDelegate`
to znaczy: Func<T>
dziedziczy z MulticastDelegate
. Zasadniczo, do wszystkich celów i celów, delegatów w .NET są delegatów multiemisji. You może być w stanie uzyskać delegata bez multiemisji w zarządzanym C++, nie wiem. Ale na pewno nie z C#.
Czy możesz podać przykład miejsca, w którym zgłasza wyjątek? –