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