为什么:string st="&引用+;12; 在c#工作而不转换?

为什么:string st="&引用+;12; 在c#工作而不转换?,c#,string,C#,String,这是超级愚蠢,但我已经谷歌和检查参考,我只是找不到一个答案。。。为什么int或float等可以作为字符串的一部分添加而不需要对话,但不能单独添加?即: 虽然这项工作很好: string st = "" + 12; 这(当然)不是: 这里的魔力在哪里?我知道它是有效的,我只是想知道它为什么有效以及我如何控制转换的完成?因为如果其中一个参数是字符串,编译器将对所有对象调用.ToString()。在第一条语句中,+的左操作数是字符串,因此,+成为串联运算符。编译器将查找以字符串和任意值作为操作数的

这是超级愚蠢,但我已经谷歌和检查参考,我只是找不到一个答案。。。为什么int或float等可以作为字符串的一部分添加而不需要对话,但不能单独添加?即:

虽然这项工作很好:

 string st = "" + 12;
这(当然)不是:


这里的魔力在哪里?我知道它是有效的,我只是想知道它为什么有效以及我如何控制转换的完成?

因为如果其中一个参数是字符串,编译器将对所有对象调用
.ToString()

在第一条语句中,
+
的左操作数是字符串,因此,
+
成为串联运算符。编译器将查找以字符串和任意值作为操作数的运算符的重载。这会将两个操作数转换为字符串(使用
ToString()
),然后合并它们

第二条语句不起作用,因为没有从
int
string
的隐式转换


您可以通过使用括号来更改操作顺序(半有效)或通过编写代码来先发制人地处理转换来控制转换的方式。

这是因为字符串数据类型上运算符+的运算符重载而起作用。

这是字符串串联的工作方式,如前所述,编译器使用
+
作为字符串连接运算符。从on字符串连接中,我们发现:

通过调用从type
object
继承的virtual
ToString
方法,任何非字符串参数都将转换为其字符串表示形式


因为第一个是表达式,C#在其中进行隐式转换

第二个是带有静态值的赋值,静态值没有要调用的方法


只要要指定的值是一个变量或表达式返回,就会有一个toSting方法可调用。

这是因为编译器将添加的内容转换为对
String.Concat()的调用。


在内部,所有操作数都被装箱(如有必要)并传递给
String.Concat
方法(该方法当然会对所有参数调用
ToString()

NET中的String Concat最终解析为对静态方法重载之一的调用。这是一个优化,以减少在单个语句中发生多个连接时将创建的临时字符串的数量

简言之,这是因为许多String.Concat重载将接受参数列表中的
对象
,并且由于int、float等本质上是对象,它们可以传递给接受一个或多个
对象
参数的Concat重载。在内部,Concat of基本上对incomming对象执行
.ToString()
,因此将
int
转换为它的字符串表示形式

在你的具体例子中

string st = "" + 12;
编译器将重新确认第一个字符串为空,只需调用
string.Concat(object)
重载。它将整数12转换为字符串,并将其分配给
st


调用此重载是因为整数可以隐式装箱以适合对象类型,从而满足方法重载选择。

检查此链接:@Cybernate:我知道有人要链接:):。。是的。。这在我的最爱列表中。请看我接受的Jon Skeet的答案,这比我预期的要复杂得多,但我现在完全理解了这种(奇怪)行为背后的原因。我想你可以把字符串的+运算符行为称为“显式感觉的隐式转换”,这是最让我吃惊的,它看起来非常显式。
string st = "" + 12;