В нескольких ответах упоминается неизменность, и это не то, что это.
Строка кода
a + b;
Это просто не законно, как отдельное утверждение. Вы получите ошибку
В качестве оператора могут использоваться только выражения присваивания, вызова, приращения, уменьшения и новых объектов.
Если сделать System.String
изменяемым, это не изменится. Если +
мутировать один или оба операнда , это не изменится. Строка кода просто не разрешена.
a = a + b; // legal
Для ясности, вы можете определить свой собственный тип, определить оператор +
, внутри метода этого оператора мутировать один из операндов (который, вероятно, рассердит ваших потребителей, изменяемый тип или нет), а затем вернуть его и все же не сделает автономную линию a + b;
законной. Вы должны использовать его результат в что-то , которое входит в одно из приведенных выше выражений (присваивание, вызов и т. Д.).
public class Foo
{
public int Bar;
public static Foo operator +(Foo a, Foo b)
{
a.Bar += b.Bar; // horrible mutation
return new Foo() { Bar = a.Bar };
}
}
///
Foo a = new Foo() { Bar = 1 };
Foo b = new Foo() { Bar = 2 };
a + b; // still not legal