代码之家  ›  专栏  ›  技术社区  ›  Afshar Mohebi

Automatic.ToString()?

  •  3
  • Afshar Mohebi  · 技术社区  · 14 年前

    我有这样的方法: void m1(string str) 有这样一节课:

    public class MyClass
    {
        public bool b1 { set; get; }
    
        //and other properties
    }
    

    IClass2 _class2 = new Class2();
    MyClass c1 = new MyClass();
    _class2.m1("abcdef" + c1);
    

    c1.ToString() m1 . 为什么是自动的 .ToString() 发生了什么?我唯一能说的是m1在 IClass2 接口并已由实现 Class2

    2 回复  |  直到 14 年前
        1
  •  9
  •   Jon Skeet    14 年前

    这遵循了C语言规范中关于字符串连接的规则。参见C#4规范第7.8.4节(加法运算符)

    字符串串联:

    string operator +(string x, string y);
    string operator +(string x, object y);
    string operator +(object x, string y);
    

    二进制文件的这些重载 + 运算符执行字符串串联。如果字符串串联的操作数是 null ,将替换空字符串。否则,任何非字符串参数都将通过调用虚拟 ToString 方法继承自类型对象。如果 退货 无效的

    如果你没料到会发生这样的事,我可以问一下你对这次调查的结果有什么期待吗 "abcdef" + c1 要表达什么?

    请注意 m1 , IClass2 Class2 ToString() ,不管那根弦后来发生了什么。

        2
  •  6
  •   Ani    14 年前

    编译器将 "abcdef" + c1 变成一个 string.Concat(object,object) .ToString() 并连接它们。以下是来自reflector的代码:

    public static string Concat(object arg0, object arg1)
    {
       if(arg0 == null) arg0 = Empty;
       if(arg1 == null) arg1 = Empty;
    
       return (arg0.ToString() + arg1.ToString());
    }
    

    string.Concat(string, string) 在哪里