Los tipos de interfaz no heredan de Object
, pero las ubicaciones de almacenamiento de los tipos de interfaz contienen referencias a objetos de clase que, si no son nulos, se heredan de System.Object
.
Creo que entender lo que está pasando será más fácil si se comienza examinando la diferencia entre los tipos de valores y los tipos de clase. Supongamos que tengo una estructura:
public struct SimplePoint {public int x,y;}
y tengo dos métodos
public doSomethingWithPoint(SimplePoint pt) ...
public doSomethingWithObject(Object it) ...
y Cal cada método:
SimplePoint myPoint = ...;
doSomethingWithPoint(myPoint);
dosomethingWithObject(myPoint);
La primera llamada no pasa una cosa que se deriva de Object
. En su lugar, pasa los contenidos de todos los campos públicos y privados de SimplePoint
.La segunda llamada necesita algo que se deriva de Object
, por lo que genera una nueva instancia de objeto de montón del tipo SimplePoint
que contiene todos los campos públicos y privados del tipo de valor SimplePoint
, y carga todos esos campos con los valores correspondientes de myPoint
y pasa una referencia a ese objeto.
Tenga en cuenta que el tipo SimplePoint
realmente describe dos tipos diferentes de cosas: una colección de campos (es decir, el tipo de valor) y un tipo de objeto de montón. Qué significado es aplicable depende del contexto donde se usa el tipo.
Los tipos de interfaz tienen una arruga similar: cuando se utilizan como tipos de ubicación de almacenamiento, especifican que la ubicación de almacenamiento contendrá una referencia de objeto. Cuando se usan como restricción genérica, no dicen nada sobre cómo se almacenará el tipo. Por lo tanto, una ubicación de almacenamiento de un tipo de interfaz mantendrá una referencia a un objeto de montón que realmente hereda de System.Object
, pero una variable de un tipo restringido a una interfaz puede contener una referencia o un grupo de campos.
"Todo tipo en C# ...", bueno, sé que los punteros no derivan directamente de System.Object; Entonces, ¿este es un ejemplo del caso de "deriva indirectamente", o los punteros no son un tipo? – codekaizen
@codekaizen Los punteros son un tema independiente. Son alienígenas del mundo .net, por lo que no se ajustan a los principales conceptos de OO. – Andrey
@codekaizen from Eric "Los tipos de punteros inseguros están explícitamente fuera de las reglas de tipo normal para el idioma". – Andrey