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