C#-字符串=字符串+整数:幕后是什么?

在C#中,您可以隐式连接一个字符串,比方说一个整数:

string sth = "something" + 0;

我的问题是:

  1. 为什么,假设您可以隐式地将一个字符串和一个int串联在一起,C#不允许这样初始化字符串:

    0.ToString()
  2. C#如何将0转换为字符串。 是0.ToString()还是(string)0或其他东西?

  3. 如何找到上一个问题的答案?
Dariusz Woźniak asked 2020-02-13T21:54:50Z
2个解决方案
51 votes

它编译为对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());
    }

(这叫ildasm


要发现这一点,您可以使用ildasm或Reflector(在IL或C#中,没有进行任何优化)来查看+行编译成的内容。

SLaks answered 2020-02-13T21:55:21Z
22 votes

这在C#4规范的7.8.4节中指定:

对于形式为string.Concat的操作,   二进制运算符重载解析   (第7.3.4节)适用于选择   具体的运营商实施。 的   操作数被转换为   所选参数类型   运算符,以及结果的类型   是运算符的返回类型。

预定义的加法运算符是   下面列出。 对于数字和   枚举类型,预定义   加法运算符计算   这两个操作数。 当一个或两个   操作数是字符串类型,   预定义的加法运算符   连接字符串表示   操作数。

最后一句话是与此情况最相关的一句话。

然后再:

字符串串联

string.Concat

这些二进制+的重载   操作员执行字符串连接。   如果是字符串串联操作数   为null,则为空字符串   替代。 否则,任何非字符串   参数被转换为其字符串   通过调用虚拟表示   string.Concat从类型继承的方法   宾语。 如果ToString返回null,则   空字符串被替换。

这指定了如何将整数转换为字符串。

结果:

字符串连接的结果   运算符是一个包含以下内容的字符串   左操作数的字符   其次是字符   正确的操作数。 字符串   串联运算符从不返回   空值。

执行连接的实际方法是特定于实现的,但是如其他答案所述,MS实现使用string.Concat

Jon Skeet answered 2020-02-13T21:56:31Z
translate from https://stackoverflow.com:/questions/3398604/string-string-int-whats-behind-the-scenes