string = string + int:幕后是什么?

时间:2010-08-03 16:32:11

标签: c# string casting integer

在C#中,你可以隐式地连接一个字符串,让我们说一个整数:

string sth = "something" + 0;

我的问题是:

  1. 为什么,假设您可以隐式连接字符串和int,C#不允许初始化字符串,如下所示:

    string sth = 0; // Error: Cannot convert source type 'int' to target type 'string'
    
  2. C#如何将0转换为字符串。是0.ToString()还是(string)0还是其他什么?

  3. 如何找到上一个问题的答案?

2 个答案:

答案 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