Section 7.5.4 of the C # specs states:
[...] if the field is readonly, and the link occurs outside the constructor of the instance of the class in which the field is declared, then the result is a value, namely the value of the field i in the object referenced by E
So, when the field is readonly , you mutate the copy (since it is impossible to change the value, but only the variable). When this is not the case, you mutate the field itself.
This is described in more detail in this Eric Lippert blog post . To quote its ending:
This is another reason why mutable value types are evil. Try to always make value types immutable.
Servy source share