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

Типы значений наследуются от System.Object... почему?

Возможные дубликаты:
Все ли в .NET объект?
Как значения ValueTypes происходят из Object (ReferenceType) и по-прежнему являются ValueTypes?

Привет, Я просто не понимаю этого. System.Object - это (я думаю) ссылочный тип, но все типы данных в .NET наследуют от него. Также используются значения типов значений. Я этого не понимаю - тип значения имеет значение в стеке, но его унаследовал от Object? Надеюсь, кто-нибудь может помочь мне понять.

4b9b3361

Ответ 1

Вы правы, что, хотя Object является ссылочным типом, типы значений наследуют от него неявно, как указано в ссылке msdn для Типы значений (согласно ссылке, они технически наследуются от класса ValueType, который, в свою очередь, наследуется от Object.

С# сделал особый случай для этого, поэтому типы значений могут извлечь выгоду из методов Object (например, ToString) и свойств. Кроме того, вы можете обрабатывать типы значений так же, как и другие типы ссылок - ничто не мешает вам подключаться к int внутри массива Object s.

Ответ 2

Спросите себя, почему вам кажется странным, что тип, который обычно выделяется в стеке, наследуется от System.Object, и я думаю, вы обнаружите, что не можете сформулировать вескую причину.

Если вы считаете это, потому что тип объекта определяет, где он выделен, вы ошибаетесь. Какой член ValueType отвечает за определение механизма распределения? (Какой член System.Object, если на то пошло?)

Наследование типов в .NET должно содержать отношения : a string - это object, например. Все в мире .NET object, поэтому int является object, a double является object и т.д.

Вы можете думать об этом в терминах принцип подстановки Лискова: если я пишу код, ожидающий object, я должен быть способен иметь дело с любым типом, который a object -ie, вообще ничего. Мой код должен быть одинаково удобным с string, int, a List<int> и т.д.

Также обратите внимание, что object гарантирует определенные члены, из-за которых все типы имеют следующие значения: GetType, ToString и GetHashCode.