Ненужное литье к объекту, используемому для вызова ToString() в mscorlib

В StringWriter (mscorlib.dll) я нашел код:

private StringBuilder _sb;
// (...)
public override string ToString()
{
  return ((object) this._sb).ToString();
} 

Я не вижу причины для этого (так же как и мой R #, но иногда это неправильно). ToString() - virtual, поэтому кастинг не меняет поведения.

Какая оптимизация здесь делается?

Ответ 1

Это не имеет никакого значения, и оптимизации нет. Сгенерированный ИЛ с и без литья точно такой же. Фактически при открытии mscorlib с Reflector он говорит только return this._sb.ToString();.

Как вы сказали, ToString() есть virtual, и он не помечен new в StringWriter, поэтому сгенерированный IL ссылается на Object.ToString() (первоначально объявленный метод) в любом случае (за исключением некоторых основные типы значений):

ldfld class System.Text.StringBuilder System.IO.StringWriter::_sb
callvirt instance string System.Object::ToString()

Даже глядя на исходный код CLI 2.0, код выглядит следующим образом:

public override String ToString() {
    return _sb.ToString();
}

Единственное отличие от Reflector заключается в том, что StringBuilder.ToString() - unsafe. В IL нет ключевого слова для этого, но его можно узнать, проверив небезопасные инструкции. R # может считать это разницей (хотя это не так) и предпочитает идти явно.

Ответ 2

Какая оптимизация здесь делается?

Отсутствует. R # здесь просто неправильно.

Ни ILSpy, ни JustDecompile показывают это странное и я также не нахожу его в исходном коде.

Итак, код просто

public override string ToString()
{
    return this._sb.ToString();
}