2009-02-05 66 views
9

假如一个同事问我这个,在我脑子昏昏沉沉的状态,我没有一个答案:字符串和整数,显性和隐性

为什么,你可以做:

string ham = "ham " + 4; 

但不是:

string ham = 4; 

如果有字符串转换当你串联,为什么不一样的隐式转换/操作时assig宁它作为一个字符串? (当然,不做一些操作符重载)

回答

19

当串联编译器开启的声明"ham" + 4进入到String.Concat一个电话,它有两个object参数,所以价值4是盒装,然后ToString被称为上。

对于分配有从intstring的隐式转换,因此你不能分配4string没有明确将其转换。

换句话说,尽管在C#中它们看起来非常相似,但编译器处理这两个任务的方式非常不同。

+0

有效真实的,但我不知道它实际上调用的毗连方法或产生类似代码。该参考似乎表明后者。 – tvanfosson 2009-02-05 20:27:25

+0

如果您使用Reflector查看发布模式代码(将其设置为显示IL),您会看到它确实会调用Concat。 – 2009-02-05 21:17:31

0

第一个表达式的右边的值是一个字符串,而第二个表达式的右边的值不是。联合在第一种情况下提供了魔力,在这种情况下,任务没有做任何特别的事情。在第二种情况下,分配继续发挥愚蠢。

2

串联时没有隐式转换。字符串连接解析为一个String.Concat调用,该调用具有一个接受对象的重载。这是执行(显式)转换为字符串的重载。

0

表达

"ham " + 4 

强制4至基于字符串类型和加法运算符的组合的字符串的隐式转换。具体来说,它是“+”运算符的质量,当执行运算符重载时,可以手动实现相同类型的东西。

类似的和不太明显的例子是:

长为mynumber = Int64.MaxValue - 1;

在这种情况下,应该将“1”评估为32位整数,但它是隐式转换的。您可以查看C#语言规范第6.1节,了解编译器支持的隐式转换的详尽列表。

编辑:要清楚,我提到的语言规范部分列出了编译器支持的隐式转换,而像“+”这样的运算符可以拥有自己支持的转换。

4

Binary +运算符是为 数字和字符串类型预定义的。对于数字 类型,+计算其两个 操作数的总和。当一个或两个操作数为 的字符串类型为+时,连接 操作数的 字符串表示形式。

Reference

赋值运算符(=)存储在 存储位置,属性,或通过其左手的操作数和 返回表示索引 的 值其右边的操作数的作为结果的价值。 操作数必须是相同类型(或 右侧操作数必须是 可隐式转换为左侧操作数的类型 )。

Reference