Talvez seja uma dúvida muito profunda, mas eu gostaria de saber como o compilador sabe que uma referência é feita para um tipo de objeto e não para outro. Em C, se temos uma variável do tipo ponteiro, este aceita qualquer endereço de memória, porém em C# é como se essa referência estivesse tipada, já que não consigo passar uma referência de classe X para uma referência de classe Y. Quando o C# guarda essa referência, ele armazena algo mais do que o endereço de memória? Como uma espécie de Id da classe?