string = string + int:幕后是什么?
在C#中,你可以隐式连接一个string,比如说一个整数:
string sth = "something" + 0;
我的问题是:
-
为什么呢,通过假设你可以隐式连接一个string和一个int的事实,C#不允许像这样初始化string:
string sth = 0; // Error: Cannot convert source type 'int' to target type 'string'
-
C#如何将string转换为0。 是
0.ToString()
或(string)0
或其他? - 如何find前一个问题的答案?
它编译为一个对String.Concat(object, object)
的调用,如下所示:
string sth = String.Concat("something", 0);
(请注意,这个特定的行实际上将被编译器优化)
这个方法的定义如下:(从.Net参考源获取)
public static String Concat(Object arg0, Object arg1) { if (arg0==null) { arg0 = String.Empty; } if (arg1==null) { arg1 = String.Empty; } return Concat(arg0.ToString(), arg1.ToString()); }
(这个调用String.Concat(string, string)
)
为了发现这一点,你可以使用ildasm
或Reflector(在IL或C#中没有优化)来查看+
行编译的内容。
这在C#4规范的第7.8.4节中有规定:
对于forms为
x + y
操作,应用二元运算符重载决策(第7.3.4节)来select特定的运算符实现。 操作数被转换为所选操作符的参数types,结果的types是操作符的返回types。下面列出了预定义的加法运算符。 对于数字和枚举types,预定义的加法运算符计算两个操作数的总和。 当一个或两个操作数是stringtypes时,预定义的加法运算符会连接操作数的string表示forms。
最后一句话是与这种情况最相关的一句话。
后来:
string连接
string operator +(string x, string y); string operator +(string x, object y); string operator +(object x, string y);
这些二进制运算符的重载执行string连接。 如果string连接的操作数为空,则replace空string。 否则,通过调用从objecttypesinheritance的虚拟
ToString
方法,将任何非string参数转换为其string表示forms。 如果ToString
返回null,则replace空string。
这指定了整数如何转换成一个string。
结果是:
string连接运算符的结果是一个由左操作数的字符和右操作数的字符组成的string。 string连接运算符永远不会返回空值。
执行级联的实际方法是特定于实现的,但是如其他答案中所述,MS实现使用string.Concat
。