La premisa es incorrecta; funciona bien:
Func<int> func = delegate { Console.WriteLine("first part"); return 5; };
func += delegate { Console.WriteLine("second part"); return 7; };
int result = func();
Es un delegado de multidifusión con un resultado no nulo, funciona bien. Puede ver desde la consola que ambas partes se ejecutaron. El resultado del último artículo es el que se devuelve. Podemos demostrar que este es un verdadero delegado de multidifusión:
if(func is MulticastDelegate) Console.WriteLine("I'm multicast");
y escribiremos "Estoy multidifusión" incluso después de sólo la primera línea (cuando sólo hay un único método en la lista).
Si necesita más control sobre los resultados individuales, a continuación, utilizar GetInvocationList()
:
foreach (Func<int> part in func.GetInvocationList())
{
int result = part();
}
que le permite ver cada resultado individual.
En la terminología IL:
.class public auto ansi sealed Func<+ TResult>
extends System.MulticastDelegate`
es decir: Func<T>
hereda de MulticastDelegate
. Básicamente, para todos los efectos, todos los delegados en .NET son delegados de multidifusión. Usted podría ser capaz de obtener un delegado no multidifusión en C++ administrado, no lo sé. Pero ciertamente no de C#.
¿Puedes dar un ejemplo de dónde arroja una excepción? –