Search code examples
c#delegatesmulticastdelegate

Multicast Delegates must have a return type of void. Why?


Multicast Delegates must have a return type of void Otherwise it will throw an exception.

I want to know whats the reason behind it, what if multiple methods could have a same return type as of a delegate ?


Solution

  • The premise is wrong; it works fine:

    Func<int> func = delegate { Console.WriteLine("first part"); return 5; };
    func += delegate { Console.WriteLine("second part"); return 7; };
    int result = func();
    

    That is a multicast delegate with a non-void result, working fine. You can see from the console that both parts executed. The result of the last item is the one returned. We can demonstrate that this is a true multicast delegate:

    if(func is MulticastDelegate) Console.WriteLine("I'm multicast");
    

    and it will write "I'm multicast" even after just the first line (when there is only a single method listed).

    If you need more control over individual results, then use GetInvocationList():

    foreach (Func<int> part in func.GetInvocationList())
    {
        int result = part();
    }
    

    which allows you to see each individual result.

    In IL terminology:

    .class public auto ansi sealed Func<+ TResult>
        extends System.MulticastDelegate`
    

    which is to say: Func<T> inherits from MulticastDelegate. Basically, to all intents and purposes, all delegates in .NET are multicast delegates. You might be able to get a non-multicast delegate in managed C++, I don't know. But certainly not from C#.