See 7.13 Assignment operators in the spec and its subsections., specifically 7.13.2 Compound assignment:
An operation of the form x op= y is processed by applying binary operator overload resolution (Section 7.2.4) as if the operation was written x op y. Then,
•If the return type of the selected operator is implicitly convertible to the type of x, the operation is evaluated as x = x op y, except that x is evaluated only once.
•Otherwise, if the selected operator is a predefined operator, if the return type of the selected operator is explicitly convertible to the type of x, and if y is implicitly convertible to the type of x, then the operation is evaluated as x = (T)(x op y), where T is the type of x, except that x is evaluated only once.
•Otherwise, the compound assignment is invalid, and a compile-time error occurs.