为什么盒装整数值可以隐式转换为字符串类型?

时间:2010-09-08 18:29:15

标签: c#

我认为类可以隐式转换为:

  • 从中派生的链中的任何类
  • 它实现的任何接口

a)在下一个例子中,以上都不是真的,那么为什么盒装整数值被隐式转换为string类型:

string s = 100 + “question”;

b)为什么下一个赋值中的值也不会隐式转换为string类型:

string s = 100;

感谢名单

3 个答案:

答案 0 :(得分:7)

这只是字符串连接运算符 - 特别是与装箱或整数无关......它是与字符串连接的任何值。

您的第二个示例不涉及任何连接,因此没有转换。

从C#规范,第7.8.4节:

  

对于x + y形式的操作,   二元运算符重载决策   (§7.3.4)适用于选择a   具体的运营商实施该   操作数转换为   所选参数类型   运算符,以及结果的类型   是运算符的返回类型。

     

预定义的附加运算符是   下面列出。对于数字和   枚举类型,预定义的   加法运算符计算总和   两个操作数。当一个或两个   操作数是字符串类型的   预定义的加法算子   连接字符串表示   操作数。

然后:

  

字符串连接:

string operator +(string x, string y);
string operator +(string x, object y);
string operator +(object x, string y);
     

binary +运算符的这些重载执行字符串连接。   如果字符串连接的操作数为null,则替换空字符串。   否则,任何非字符串参数都将转换为其字符串表示形式   通过调用从类型对象继承的虚拟ToString方法。   如果ToString返回null,则替换空字符串。

事实上,在您的示例中,使用当前的MS C#编译器,它只会将整数框打包并调用string.Concat(object, object) - 但编译器知道它将与调用string.Concat(100.ToString(), "question")具有相同的结果。< / p>

一个有趣的事实:string类本身不存在+运算符。该语言对它有特殊处理(正如我们已经看到的),最终调用Concat。这样做的一个优点是

x + y + z

可以编译成

string.Concat(x, y, z)

可以一次执行整个连接,而不是构建无意义的中间字符串。

(另请注意,编译器会自行执行编译时常量字符串的连接。)

答案 1 :(得分:2)

这是+操作符的一个功能,而不是装箱。

答案 2 :(得分:2)

这与+运营商有关。

基本上,在这种情况下+的方法签名是:

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

因此,int会转换为string

但是,尝试将int值粘贴到string引用中只是语法错误。