Как Equals и GetHashCode реализованы на анонимных типах?

Помощь говорит это:

Анонимные типы - это типы классов, которые наследуются непосредственно от объекта и не могут быть преобразованы ни к какому типу, кроме объекта. Компилятор предоставляет имя для каждого анонимного типа, хотя ваше приложение не может получить к нему доступ. С точки зрения общеязыковой среды выполнения анонимный тип ничем не отличается от любого другого ссылочного типа.

Если два или более инициализатора анонимных объектов в сборке задают последовательность свойств, которые находятся в одном и том же порядке и имеют одинаковые имена и типы, компилятор обрабатывает объекты как экземпляры одного типа. Они используют одну и ту же информацию о типах, созданную компилятором.

Поскольку методы Equals и GetHashCode для анонимных типов определены в терминах методов Equals и GetHashCode свойств, два экземпляра одного и того же анонимного типа равны, только если все их свойства равны.

Это правда, но как? Исходный источник явно показывает, как сравниваются объекты (ReferenceEquals) и тип, «производный непосредственно от объекта», не может иметь такого особого поведения. Это не соответствует поведениюEquals вValueType или.

Так как это сделать? Как анонимные типы могут переопределятьEquals() а такжеGetHashCode() без каких-либо видимых переопределений?