在C#中,你可以隐式地连接一个字符串,让我们说一个整数:
string sth = "something" + 0;
我的问题是:
为什么,假设您可以隐式连接字符串和int,C#不允许初始化字符串,如下所示:
string sth = 0; // Error: Cannot convert source type 'int' to target type 'string'
C#如何将0转换为字符串。是0.ToString()
还是(string)0
还是其他什么?
答案 0 :(得分:50)
它编译为对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#中没有优化)来查看+
行编译的内容。
答案 1 :(得分:22)
这在C#4规范的第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);
二进制+的这些重载 运算符执行字符串连接。 如果字符串连接的操作数 为null,空字符串为 取代。否则,任何非字符串 参数转换为其字符串 通过调用虚拟表示 从类型继承的
ToString
方法 宾语。如果ToString
返回null,则为 空字符串被替换。
指定整数如何转换为字符串。
结果:
字符串连接的结果 operator是一个包含的字符串 左操作数的字符 其次是人物 右操作数。字符串 连接运算符永远不会返回 空值。
执行连接的实际方法是特定于实现的,但正如其他答案中所述,MS实现使用string.Concat
。