Это как делать:
string x = "x";
string y = "y";
x += y;
Строки тоже неизменны. Приведенный выше код не меняет строку objects - он устанавливает x
в другое значение.
Необходимо различать переменные и объекты . Если тип является неизменяемым, это означает, что вы не можете изменять данные в экземпляре этого типа после его создания. Вы можете присвоить переменной этого типа другое значение.
Если вы понимаете, как это работает со строками, то же самое верно и для делегатов. + = Фактически называется Delegate.Combine, так что это:
x += y;
эквивалентно:
x = Delegate.Combine(x, y);
Он ничего не меняет в объекте делегата, на который x
ранее ссылался - он просто создает новый объект делегата и присваивает x
значение, которое ссылается на этот новый делегат.