Типы интерфейсов не наследуются от Object
, но места хранения типов интерфейсов содержат ссылки на объекты класса, которые (если не нуль) гарантированно наследуются от System.Object
.
Я думаю, что понимание того, что происходит, будет проще всего, если начать с изучения разницы между типами значений и типами классов. Предположим, что у меня есть структура:
public struct SimplePoint {public int x,y;}
и у меня есть два метода
public doSomethingWithPoint(SimplePoint pt) ...
public doSomethingWithObject(Object it) ...
и кал каждый метод:
SimplePoint myPoint = ...;
doSomethingWithPoint(myPoint);
dosomethingWithObject(myPoint);
Первый звонок не проходит вещь, производный от Object
. Вместо этого он передает содержимое всех SimplePoint
's государственных и частных полей.Второй вызов требует вещи, которая происходит от Object
, поэтому она генерирует новый экземпляр объекта кучи типа SimplePoint
, который содержит все общедоступные и частные поля значения типа SimplePoint
и загружает все эти поля с соответствующими значениями от myPoint
и передает ссылку на этот объект.
Обратите внимание, что тип SimplePoint
фактически описывает два разных типа вещей: коллекцию полей (т. Е. Тип значения) и тип объекта кучи. Какое значение применимо, зависит от контекста, в котором используется этот тип.
Типы интерфейсов имеют аналогичную морщину: при использовании в качестве типов хранения данных они указывают, что место хранения будет содержать ссылку на объект. При использовании в качестве общего ограничения они ничего не говорят о том, как будет сохранен тип. Таким образом, место хранения типа интерфейса будет содержать ссылку на объект кучи, который действительно наследует от System.Object
, но переменная типа, ограниченная интерфейсом, может содержать ссылку или совокупность полей.
«Каждый тип в C# ...», ну, я знаю, указатели не выводятся непосредственно из System.Object; так это пример случая «косвенно вытекает» или указатели не являются типом? – codekaizen
@codekaizen Указатели являются отдельной темой. Они являются инопланетянами в мире .net, поэтому они не вписываются в основные концепции ОО. – Andrey
@codekaizen от Eric «Небезопасные типы указателей явно не соответствуют нормальным правилам для языка». – Andrey