 <p><code>SomeStruct.OtherStruct</code> is a property, returning a value - it's not a variable. This line:</p> <pre><code>a.OtherStruct.PublicProperty++; </code></pre> <p>is like calling:</p> <pre><code>a.get_OtherStruct().PublicProperty++; </code></pre> <p>Because the expression <code>a.get_OtherStruct()</code> is a <em>value</em> rather than a <em>variable</em>, it's a bit like doing this:</p> <pre><code>OtherStruct tmp = a.get_OtherStruct(); tmp.PublicProperty++; </code></pre> <p>Changing the value of <code>PublicProperty</code> in the <em>copy</em> of <code>OtherStruct</code> returned by the property isn't going to change the original value at all. That's almost certainly not your intention. The C# designers foresaw this sort of problem, and managed to prohibit it in many situations.</p> <p>Note that if <code>OtherStruct</code> were a reference type (a class) instead, then it would be the <em>reference</em> that was copied, not the values within it... so changing <code>tmp.PublicProperty</code> <em>would</em> make a difference. See my <a href="http://pobox.com/~skeet/csharp/references.html" rel="nofollow noreferrer">article on reference and value types</a> for more information.</p> <p>Btw, mutable structs like this are generally a really bad idea. They cause all kinds of problems, and hard-to-predict code.</p> <p>EDIT: In response to your "answer", the two lines <em>aren't</em> the same: the <code>a.OtherStruct</code> property expression isn't the target of an assignment operator or a compound assignment operator.</p> <p>You can argue that you'd like C# to be defined in a way which would allow this (although I'd still disagree) but the compiler <em>is</em> implementing the specification correctly. See section 10.7.2 of the C# 3.0 spec for more details.</p>