Como o Equals e o GetHashCode são implementados em tipos anônimos?
A Ajuda diz o seguinte:
Tipos anônimos são tipos de classe que derivam diretamente do objeto e que não podem ser convertidos para nenhum tipo, exceto o objeto. O compilador fornece um nome para cada tipo anônimo, embora seu aplicativo não possa acessá-lo. Da perspectiva do Common Language Runtime, um tipo anônimo não é diferente de qualquer outro tipo de referência.
Se dois ou mais inicializadores de objetos anônimos em uma montagem especificarem uma sequência de propriedades que estejam na mesma ordem e que tenham os mesmos nomes e tipos, o compilador tratará os objetos como instâncias do mesmo tipo. Eles compartilham as mesmas informações de tipo gerado pelo compilador.
Como os métodos Equals e GetHashCode em tipos anônimos são definidos em termos dos métodos Equals e GetHashCode das propriedades, duas instâncias do mesmo tipo anônimo são iguais apenas se todas as suas propriedades forem iguais.
Essas coisas são verdadeiras, mas como? A fonte de referência mostra explicitamente como os objetos são comparados (ReferenceEquals
) e um tipo que "deriva diretamente do objeto" não pode ter esse comportamento especial. Não corresponde ao comportamento deEquals
noValueType
ou.
Então, como isso é feito? Como os tipos anônimos podem substituirEquals()
eGetHashCode()
sem substituições visíveis?