Автоматический .ToString ()? - PullRequest
       14

Автоматический .ToString ()?

3 голосов
/ 21 сентября 2010

У меня есть такой метод: 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 ]

8 голосов
/ 21 сентября 2010

Это соответствует правилам спецификации языка C # в отношении конкатенации строк. См. Раздел 7.8.4 спецификации C # 4 (оператор сложения)

Конкатенация строк:

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

Эти перегрузки двоичного оператора + выполняют конкатенацию строк. Если операндом конкатенации строк является null, подставляется пустая строка. В противном случае любой нестроковый аргумент преобразуется в его строковое представление, вызывая виртуальный метод ToString, унаследованный от объекта типа. Если ToString возвращает null, подставляется пустая строка.

Если вы не ожидали, что это произойдет, могу я спросить, что вы ожидаете от результата выражения "abcdef" + c1?

Обратите внимание, что m1, IClass2 и Class2 не имеют отношения к тому, что здесь происходит - это действительно только выражение конкатенации: это то, что вызывает вызов к ToString(), независимо от того, что позже с ним происходит строка.

6 голосов
/ 21 сентября 2010

Компилятор превращает "abcdef" + c1 в string.Concat(object,object) вызов.Это, в свою очередь, вызовет .ToString() для каждого из аргументов и объединит их.Вот код из отражателя:

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), где происходит конкатенация real .

...