One interesting feature of delegates in C# is that it provide ways to attach / detach more than one methods that has method signature similar to the delegate declared and combine them together.

This combining or attaching / detaching of methods to a delegate is called Multicasting.

Behind the scenes:

This multicasting is possible because delegates inherit from System.MulticastDelegate which in turn inherits from System.Delegate, which inherits from Object class.

How to multicast:

Multicasting can be done using += and / or -= operator.

Here is an example that demonstrate use of += and -= to multicast delegates.

private delegate void Greetings();

static void Main(string[] args)
{
    SayHello();
    Console.ReadLine();
}

public static void SayHelloToScott()
{
    Console.WriteLine("Hi Mr. Delegate, from Scott");
}

public static void SayHelloToAlex()
{
    Console.WriteLine("How about a coffee? from Alex");
}

public static void SayHelloToJasmine()
{
    Console.WriteLine("Hi delegates, from Jasmine");
}

public static void SayHelloToJsinh()
{
    Console.WriteLine("Delegates aahaa, from Jsinh");
}

public static void SayHello()
{
    Greetings greets = SayHelloToScott;
    greets += SayHelloToAlex;
    greets += SayHelloToJasmine;
    greets += SayHelloToJsinh;
    greets();

    Console.WriteLine(Environment.NewLine);
    greets -= SayHelloToAlex;
    greets();

    Console.WriteLine(Environment.NewLine);
    var test = greets.GetInvocationList();
    foreach (var info in test.Select(item => item.GetMethodInfo()))
    {
        Console.WriteLine(info.Name);
    }
}

Output:

Hi Mr. Delegate, from Scott
How about a coffee? from Alex
Hi delegates, from Jasmine
Delegates aahaa, from Jsinh

Hi Mr. Delegate, from Scott
Hi delegates, from Jasmine
Delegates aahaa, from Jsinh

SayHelloToScott
SayHelloToJasmine
SayHelloToJsinh

More

System.MulticastDelegate contains a method GetInvocationList(). It provides a list of Delegate instance which are attached to this delegate instance.

Happy Coding !!