Ответ 1
Int32 - это структура и, следовательно, тип значения. Но:
System.Object
System.ValueType
System.Int32
Int32 происходит из System.ValueType, и это само происходит из System.Object. Et voilà...
Это документы о .ToString()
, которые вызвали этот вопрос. Они заявляют:
Поскольку Object является базовым классом всех ссылочных типов в .NET Framework, это поведение [.ToString()] наследуется ссылочными типами, которые не переопределить метод ToString.
Далее он переходит в состояние:
Например, базовые типы, такие как Char, Int32 и String, предоставляют реализации ToString
Однако Int32 является struct и, следовательно, должен быть типом значения.
Итак, что здесь происходит? Does Int32 реализует это очень собственное .ToString(), которое не имеет ничего общего с Object?
Int32 - это структура и, следовательно, тип значения. Но:
System.Object
System.ValueType
System.Int32
Int32 происходит из System.ValueType, и это само происходит из System.Object. Et voilà...
Да, Int32
переопределяет ToString
... хотя это несколько не имеет значения. Все типы наследуют членов object
- вы всегда можете вызвать ToString()
, вы всегда можете вызывать Equals
и т.д. (ValueType
переопределяет Equals
и GetHashCode
для вас, хотя вы должны почти всегда переопределять их дальше в структурах, чтобы обеспечить более эффективную реализацию.)
Обратите внимание, что вы можете очень легко переопределить методы:
public struct Foo
{
public override string ToString()
{
return "some dummy text";
}
}
Неясно, какой аспект вас смущает (здесь задействовано немало различных областей). Если бы вы могли уточнить, мы могли бы решить конкретную проблему.
Возможно, вы запутались в том, что не понимаете, какие типы значений наследуются от Object
? Вот график наследования System.Object
, System.ValueType
, System.Int32
и MyNamespace.Customer
, который должен быть классом собственного творения. Я ленился и не писал все общедоступные методы и интерфейсы Int32
.
ToString
объявляется в Object
, но переопределяется как в ValueType
, так и в Int32
.
Документы ошибочны. Оба типа ссылок и значений наследуют это поведение от объекта (но помните, что не все в .NET - это класс, который происходит от объекта).
Все (большинство?) типов значений ядра переопределяют ToString(), чтобы вернуть что-то более разумное, чем имя класса.
Я думаю, что короткий ответ на ваш вопрос заключается в том, что типы значений наследуют от System.ValueType и которые, в свою очередь, наследуются от объекта.
Каждый struct
имеет наследование класса System.ValueType
(не разрешено), которое выполняется исключительно компилятором. Все struct
имеют методы из базового класса ValueType
, который унаследован от класса Object
, заставляет нас иметь доступ к ToString()
и всем остальным.
Даже если ValueType
наследуется от класса Object
, но имеет специальную реализацию переопределений.