Каждый тип в .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, который является классом.
Ответы
Ответ 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
Ответ 3
Всего несколько недель назад Эрик Липперт написал об этом: Не все происходит от объекта. Замечательно прочитано.
Ответ 4
Что касается вашего вопроса, структуры наследуют от ValueType неявно, что, в свою очередь, происходит от объекта.
Кроме того, ссылка, опубликованная выше Эрик Липперт, - это то, что вы хотели бы прочитать.