In the second case it is the assignment that is failing, not the calculation itself. If you explicitly cast the result in the second line to a char it works fine and indeed the following three lines generate identical IL:
c += (char)1;
c = (char)(c + (char)1);
c = (char)(c + 1);
So yes. There is a difference.
Note in the third line I didn't bother casting the 1
to char
since the calculation will just convert it back to an int anyway.