Как Equals и GetHashCode реализованы на анонимных типах?
Помощь говорит это:
Анонимные типы - это типы классов, которые наследуются непосредственно от объекта и не могут быть преобразованы ни к какому типу, кроме объекта. Компилятор предоставляет имя для каждого анонимного типа, хотя ваше приложение не может получить к нему доступ. С точки зрения общеязыковой среды выполнения анонимный тип ничем не отличается от любого другого ссылочного типа.
Если два или более инициализатора анонимных объектов в сборке задают последовательность свойств, которые находятся в одном и том же порядке и имеют одинаковые имена и типы, компилятор обрабатывает объекты как экземпляры одного типа. Они используют одну и ту же информацию о типах, созданную компилятором.
Поскольку методы Equals и GetHashCode для анонимных типов определены в терминах методов Equals и GetHashCode свойств, два экземпляра одного и того же анонимного типа равны, только если все их свойства равны.
Это правда, но как? Исходный источник явно показывает, как сравниваются объекты (ReferenceEquals
) и тип, «производный непосредственно от объекта», не может иметь такого особого поведения. Это не соответствует поведениюEquals
вValueType
или.
Так как это сделать? Как анонимные типы могут переопределятьEquals()
а такжеGetHashCode()
без каких-либо видимых переопределений?