Подтвердить что ты не робот

Каждый тип в .net наследуется от System.Object?

Это может быть очень простой вопрос, но я немного смущен. Если я отражу код типа Int32/Double/any value, я вижу, что они являются структурами и выглядят следующим образом:

[Serializable, StructLayout(LayoutKind.Sequential), ComVisible(true)]
public struct Double : IComparable, IFormattable, IConvertible, IComparable<double>, IEquatable<double>
{
....
}

Итак, почему мы говорим, что все в .NET происходит из System.Object. Я думаю, что здесь отсутствует какой-то важный момент.

EDIT: Что еще меня смущает, так это то, как может тип значения, который наследует структуру от System.Object, который является классом.

4b9b3361

Ответ 1

Эрик Липперт рассказал об этом в записи в блоге: Не все происходит от объекта (Это название записи в блоге; не ответ на этот вопрос. Не путайте.)

Да, все struct наследуют от System.ValueType, который, в свою очередь, наследует от System.Object. enum вы объявляете inherit от System.Enum, который наследует от System.ValueType.

Обновление:

По сути, нет проблемы с получением типа значения из ссылочного типа. Наследование - это "is-a" связь между двумя типами. Однако, чтобы рассматривать тип значения как экземпляр объекта, он должен быть помещен в коробку. Это делается неявно, когда вы передаете значение методу, который ожидает параметр объекта (или когда вы вызываете методы экземпляра, реализованные в System.Object.)

Ответ 2

Не каждый тип, но System.Double делает.

Из сообщения Эрика Липперта:

Все типы значений, включая перечисления и типы с нулевым значением, выводимые из объекта

В С# struct используется синтаксический сахар для System.ValueType, что означает, что System.Double происходит из System.ValueType. Поскольку System.ValueType происходит из System.Object, System.Double тоже. Вы можете видеть, что с использованием исходного кода .Net Framework или с использованием .Net Reflector:


.class public sequential ansi serializable sealed beforefieldinit Double
    extends System.ValueType


UPDATE:

На панели инструментов, если вы выберете С#, вы увидите (это то, что вы видите): alt text http://bqqqkg.bay.livefilestore.com/y1pk3EAm_SJtl4dn51HLrhdgHAXCS08-xY9nQUARCpT4WnBQyRHD4RLmIK9zZ4okJXMj7Xopg1EBuY_Od7_oWz7Pw/DoubleCSharp.jpg

Если вы измените ComboBox и выберите IL, вы увидите: alt text http://bqqqkg.bay.livefilestore.com/y1pRXk-0rDvFjj7b8EqU9-bydzpWjVGJMq8pDbiCr6aALob3j-aC9vvbeBS4vQRedHJ5Dh2CWtYRCywMJ9FGHOaaw/DoubleIL.jpg

Смотрите, что в IL, Double extends System.ValueType

Ответ 4

Что касается вашего вопроса, структуры наследуют от ValueType неявно, что, в свою очередь, происходит от объекта.

Кроме того, ссылка, опубликованная выше Эрик Липперт, - это то, что вы хотели бы прочитать.