Нет способа получить а) исключения, б) возвращать значения от делегатов, только путем прослушивания в списке результатов. Другой способ - просто иметь список делегатов и управлять им вручную.

ужно немного больше узнать о делегатах и ​​дизайне языка C #.

Скажем, у меня естьMulticastDelegate который реализуетобщий делегат и содержит несколько звонков:

Func<int> func = null;
func += ( )=> return 8;
func += () => return 16;
func += () => return 32;

Теперь этот код вернет 32:

int x = func(); // x=32

Я хотел бы знать, существует ли (или лучше я должен спросить, почему он не существует!) Языковая функция C #, с помощью которой можно получить доступ к результатам всех вызовов делегата, то есть получить список ({8 , 16,32})?

Конечно, можно сделать то же самое, используя подпрограммы .NET Framework. Примерно так будет работать:

public static List<TOut> InvokeToList<TOut>(this Func<TOut> func)
{
    var returnValue = new List<TOut>();
    if (func != null)
    {
        var invocations = func.GetInvocationList();
        returnValue.AddRange(invocations.Select(@delegate => ((Func<TOut>) @delegate)()));
    }
    return returnValue;
}

Но я не могу понять из системы, что должен быть лучший способ, по крайней мере без приведения (действительно, почему MulticastDelegate не является универсальным, когда делегаты)?

Ответы на вопрос(3)

Ваш ответ на вопрос