Делегаты являются неизменными ....
При добавлении нового обработчика создается новый делегат .
Под капотом вызывается метод Delegate.Combine
Объединяет списки вызовов двух делегатов.
Возвращает
Новый делегат со списком вызовов, который объединяет списки вызовов a и b в указанном порядке .Возвращает a, если b равно нулю, возвращает b, если a является нулевой ссылкой, и возвращает нулевую ссылку, если a и b являются нулевыми ссылками.
Вы можете увидеть это в действии здесь
Action action = <>c.<>9__0_0 ?? (<>c.<>9__0_0 = new Action(<>c.<>9.<M>b__0_0));
Action action2 = action;
action = (Action)Delegate.Combine(action, <>c.<>9__0_1 ?? (<>c.<>9__0_1 = new Action(<>c.<>9.<M>b__0_1)));
action2();
Console.ReadKey();