开发者

Why can boxed integer value get implicitly converted to string type?

I thought class can be implicitly converted only to:

a) None of the above is true in next example, so why does boxed integer value get implicitly converted to string type:

string s = 100 + “question”;

b) Why then doesn’t the value in next assignment also get implicitly converted to string type:

string s = 100;

thanx


That's just the string concatenation operator - nothing to do with boxing or integers in particular... it's any value which is being concatenated with a string.

Your second example doesn't involve any concatenation, hence no conversion.

From the C# spec, section 7.8.4:

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.

and then:

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.

In fact, in your example, with the current MS C# compiler, it will simply box the integer and call string.Concat(object, object) - but the compiler knows that will have the same result as calling string.Concat(100.ToString(), "question").

One interesting point of fact: the + operator doesn't exist in the string class itself. The language has special handling for it (as we've already seen) which ends up calling Concat. One advantage of this is that

x + y + z

can be compiled into

string.Concat(x, y, z)

which can perform the whole concatenation in one go, rather than building a pointless intermediate string.

(Also, note that the compiler performs concatenations of compile-time constant strings itself.)


This is a feature of the + operator and not the boxing.


This has to do with the + operator.

Essentially, the method signature for + in this case is:

public string +(string s) {
    return this.ToString() + s;
}

So, the int gets converted to a string.

But, it is simply a syntax error to try and stick an int value into a string reference.

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜