Поскольку Int32 является типом значения, почему он наследует .ToString()?

Это документы о .ToString(), которые вызвали этот вопрос. Они заявляют:

Поскольку Object является базовым классом всех ссылочных типов в .NET Framework, это поведение [.ToString()] наследуется ссылочными типами, которые не переопределить метод ToString.

Далее он переходит в состояние:

Например, базовые типы, такие как Char, Int32 и String, предоставляют реализации ToString

Однако Int32 является struct и, следовательно, должен быть типом значения.

Итак, что здесь происходит? Does Int32 реализует это очень собственное .ToString(), которое не имеет ничего общего с Object?

Ответ 1

Int32 - это структура и, следовательно, тип значения. Но:

System.Object
   System.ValueType
      System.Int32

Int32 происходит из System.ValueType, и это само происходит из System.Object. Et voilà...

Ответ 2

Да, Int32 переопределяет ToString... хотя это несколько не имеет значения. Все типы наследуют членов object - вы всегда можете вызвать ToString(), вы всегда можете вызывать Equals и т.д. (ValueType переопределяет Equals и GetHashCode для вас, хотя вы должны почти всегда переопределять их дальше в структурах, чтобы обеспечить более эффективную реализацию.)

Обратите внимание, что вы можете очень легко переопределить методы:

public struct Foo
{
    public override string ToString()
    {
        return "some dummy text";
    }
}

Неясно, какой аспект вас смущает (здесь задействовано немало различных областей). Если бы вы могли уточнить, мы могли бы решить конкретную проблему.

Ответ 3

Возможно, вы запутались в том, что не понимаете, какие типы значений наследуются от Object? Вот график наследования System.Object, System.ValueType, System.Int32 и MyNamespace.Customer, который должен быть классом собственного творения. Я ленился и не писал все общедоступные методы и интерфейсы Int32.

UML

ToString объявляется в Object, но переопределяется как в ValueType, так и в Int32.

Ответ 4

Документы ошибочны. Оба типа ссылок и значений наследуют это поведение от объекта (но помните, что не все в .NET - это класс, который происходит от объекта).

Все (большинство?) типов значений ядра переопределяют ToString(), чтобы вернуть что-то более разумное, чем имя класса.

Ответ 5

Я думаю, что короткий ответ на ваш вопрос заключается в том, что типы значений наследуют от System.ValueType и которые, в свою очередь, наследуются от объекта.

Ответ 6

Каждый struct имеет наследование класса System.ValueType (не разрешено), которое выполняется исключительно компилятором. Все struct имеют методы из базового класса ValueType, который унаследован от класса Object, заставляет нас иметь доступ к ToString() и всем остальным.

Даже если ValueType наследуется от класса Object, но имеет специальную реализацию переопределений.