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?

questionAnswers(1)

yourAnswerToTheQuestion