Em C# todo tipo pode ser visto como um objeto. Isto quer dizer basicamente o seguinte:
- Qualquer expressão, de qualquer tipo, pode ser atribuída a uma variável do tipo object;
- Qualquer expressão, de qualquer tipo, tem propriedades e métodos;
Os tipos “por referência”, pela própria natureza, são referências (“ponteiros domesticados”) e não implicam em um custo a mais ao terem propriedades e métodos. Já os tipos por valor, em princípio, não carregam nenhum custo adicional. Eles são automaticamente convertidos para referências quando necessário em um processo conhecido como “boxing” que será explicado adiante.
Como já foi comentado, o tipo base que promove toda a unicidade deste sistema de tipos é o Object. Relembrando, todos os tipos criados herdam implicitamente de object e podem ser representados por ele, ou seja, object pode receber qualquer outro tipo, inclusive primitivos (por valor).