This is specified in section 7.8.4 of the C# 4 spec:
For an operation of the form x + y
,
binary operator overload resolution
(§7.3.4) is applied to select a
specific operator implementation. The
operands are converted to the
parameter types of the selected
operator, and the type of the result
is the return type of the operator.
The predefined addition operators are
listed below. For numeric and
enumeration types, the predefined
addition operators compute the sum of
the two operands. When one or both
operands are of type string, the
predefined addition operators
concatenate the string representation
of the operands.
The last sentence is the most relevant one to this situation.
Then later:
String concatenation
string operator +(string x, string y);
string operator +(string x, object y);
string operator +(object x, string y);
These overloads of the binary +
operator perform string concatenation.
If an operand of string concatenation
is null, an empty string is
substituted. Otherwise, any non-string
argument is converted to its string
representation by invoking the virtual
ToString
method inherited from type
object. If ToString
returns null, an
empty string is substituted.
That specifies how the integer is converted into a string.
And the result:
The result of the string concatenation
operator is a string that consists of
the characters of the left operand
followed by the characters of the
right operand. The string
concatenation operator never returns a
null value.
The actual means of performing concatenation is implementation-specific, but as noted in other answers, the MS implementation uses string.Concat
.