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

На этот вопрос уже есть ответ здесь:

Является ли все в .NET объектом? 17 ответов

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

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

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

РЕДАКТИРОВАТЬ: Что меня смущает, так это то, что как тип значения, который является struct, наследуется от System.Object, который является классом.

Ответы на вопрос(4)

Тип ценности косвенным образом, который в свою очередь происходит от объекта.

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

Решение Вопроса

Не все происходит от объекта (Это название записи в блоге;не ответ на этот вопрос, Дон»запутаться.)

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

Обновить:

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

 Igal Tabachnik22 авг. 2009 г., 20:14
Побей меня на 3 секунды :)
 Mehrdad Afshari22 авг. 2009 г., 21:28
ПК: Форматирование комментариев облажалось. Я'Я сделаю репост
 Mehrdad Afshari22 авг. 2009 г., 20:35
ПК: Вы можете увидеть, используя .NET Reflector иildasm.exe, В Reflector перейдите в mscorlib> Система> Int32, Enum, ...> Базовые типы и тыПосмотрим System.ValueType.
 Mehrdad Afshari22 авг. 2009 г., 21:31
PK:struct сам по себе не тип. Например, Int32, Double и структуры, которые вы пишете в коде, являются типами, которые непосредственно из System.ValueType. Каждое перечисляемое вами перечисление также является отдельным типом, который наследуется отSystem.Enum который наследуется от System.ValueType.
 P.K22 авг. 2009 г., 20:22
отличная ссылка ... но это смутило меня больше. Эрик говорит:Все типы значений, включая перечисления и обнуляемые типы, являются производными от объекта ... '
 P.K22 авг. 2009 г., 20:44
Теперь это означает, что каждый тип в .net на самом деле является классом. Моя голова сейчас кружится. Также я вижу Enum, но не структурирую с помощью отражателя.
 P.K22 авг. 2009 г., 20:33
@ Mehrdad Вы говорите, что Enums и структуры наследуют от System.ValueType. Где я могу это увидеть? Я могу'Я не вижу этого, используя отражатель.
 Alfred Myers22 авг. 2009 г., 21:00
@PK: Вы можете увидеть это с помощью рефлектора, если вы переключаетесь на IL.
 Mehrdad Afshari22 авг. 2009 г., 20:23
Перечисления и структуры наследуются отSystem.ValueType который в свою очередь наследует от.System.Object
 Brian Rasmussen22 авг. 2009 г., 20:16
И я только что связал эту запись в другом посте ...
 P.K22 авг. 2009 г., 21:20
@Mehrdad '... и структуры, которые вы пишете в коде, являются структурами, Что это значит?

От Эрика Липпертапост:

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

В C # 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


ОБНОВИТЬ:

На панели инструментов, если вы выберите C #, вы 'посмотрим (это то, что вы видите):альтернативный текст

Если вы измените ComboBox и выберите IL, то вы 'я увижу: альтернативный текст

Посмотрите, что в IL Double расширяет System.ValueType

 P.K22 авг. 2009 г., 20:35
Двойной это структура. Как это может быть получено из System.ValueType. Также я вижу код Double. Он просто реализует интерфейсы.
 Alfred Myers22 авг. 2009 г., 20:44
@PK: Пожалуйста, прочитайте ответ. Если вы посмотрите на IL вместо метаданных или кода, декомпилированного в C #, вы 'посмотрим, что Double наследует от ValueType. Из спецификации C #: Структуры являются типами значений ($ 11.3.1). Все типы структур неявно наследуются от класса System.ValueType ($ 11.3.2).
 shahkalpesh22 авг. 2009 г., 20:30
Это не просто Double, это все основные типы, такие как int, short, long, decimal и т. Д., Которые происходят от System.ValueType.
 Alfred Myers22 авг. 2009 г., 20:34
Я знаю это. Я случайно использовал Double в качестве примера, который он сделал.

Эрик Липперт написал об этом в блоге:Не все происходит от объекта, Отличное чтение.

Ваш ответ на вопрос