我认为类可以隐式转换为:
a)在下一个例子中,以上都不是真的,那么为什么盒装整数值被隐式转换为string
类型:
string s = 100 + “question”;
b)为什么下一个赋值中的值也不会隐式转换为string
类型:
string s = 100;
感谢名单
答案 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
引用中只是语法错误。