假如一个同事问我这个,在我脑子昏昏沉沉的状态,我没有一个答案:字符串和整数,显性和隐性
为什么,你可以做:
string ham = "ham " + 4;
但不是:
string ham = 4;
如果有字符串转换当你串联,为什么不一样的隐式转换/操作时assig宁它作为一个字符串? (当然,不做一些操作符重载)
假如一个同事问我这个,在我脑子昏昏沉沉的状态,我没有一个答案:字符串和整数,显性和隐性
为什么,你可以做:
string ham = "ham " + 4;
但不是:
string ham = 4;
如果有字符串转换当你串联,为什么不一样的隐式转换/操作时assig宁它作为一个字符串? (当然,不做一些操作符重载)
当串联编译器开启的声明"ham" + 4
进入到String.Concat
一个电话,它有两个object
参数,所以价值4
是盒装,然后ToString
被称为上。
对于分配有从int
到string
的隐式转换,因此你不能分配4
到string
没有明确将其转换。
换句话说,尽管在C#中它们看起来非常相似,但编译器处理这两个任务的方式非常不同。
第一个表达式的右边的值是一个字符串,而第二个表达式的右边的值不是。联合在第一种情况下提供了魔力,在这种情况下,任务没有做任何特别的事情。在第二种情况下,分配继续发挥愚蠢。
串联时没有隐式转换。字符串连接解析为一个String.Concat调用,该调用具有一个接受对象的重载。这是执行(显式)转换为字符串的重载。
表达
"ham " + 4
强制4至基于字符串类型和加法运算符的组合的字符串的隐式转换。具体来说,它是“+”运算符的质量,当执行运算符重载时,可以手动实现相同类型的东西。
类似的和不太明显的例子是:
长为mynumber = Int64.MaxValue - 1;
在这种情况下,应该将“1”评估为32位整数,但它是隐式转换的。您可以查看C#语言规范第6.1节,了解编译器支持的隐式转换的详尽列表。
编辑:要清楚,我提到的语言规范部分列出了编译器支持的隐式转换,而像“+”这样的运算符可以拥有自己支持的转换。
有效真实的,但我不知道它实际上调用的毗连方法或产生类似代码。该参考似乎表明后者。 – tvanfosson 2009-02-05 20:27:25
如果您使用Reflector查看发布模式代码(将其设置为显示IL),您会看到它确实会调用Concat。 – 2009-02-05 21:17:31