В продолжение вашего комментария:
Я запутался в области действия анонимных типов
Сначала давайте четко определим «сферу». Область действия типа определяется как область текста программы, в которой тип может указываться его безусловным именем .
С этим определением очевидно, что является областью действия анонимного типа. Существует нет области программного текста, в которой анонимный тип может быть указан по имени , поскольку у него нет имени . Анонимные типы вообще не имеют области видимости. Вам не нужно беспокоиться о его масштабах; это не имеет смысла.
Поля анонимного типа также не имеют области видимости, но по другой причине. Поля анонимного типа имеют имена, но ссылаться на них по неполным именам никогда не разрешается, поэтому область действия каждого поля пуста.
Я не уверен, что будет видимость этого типа в области видимости метода или класса.
Опять же, давайте четко определим наши термины. Область действия объекта может включать в себя объекты, которые определяют пространства объявлений . Эти пространства объявлений могут объявлять сущности с тем же именем, что и исходная сущность. Эти сущности имеют свои собственные области видимости, которые могут быть вложены в область действия исходной сущности.
В этой ситуации более вложенный объект может «скрыть» менее вложенный объект. Сущность, которая не скрыта таким образом, называется "видимой" в определенном текстовом месте.
Анонимный тип не имеет области видимости и, очевидно, его нельзя скрыть по имени, поскольку у него нет имени. Спрашивать, является ли анонимный тип «видимым» или нет, не имеет смысла; «видимость» имеет смысл только для вещей с именами.
Я думаю, что, учитывая, что этот тип нигде не объявлен, как компилятор может определить, о каком типе я говорю?
Компилятор запоминает каждое текстовое расположение, в котором вы используете анонимный тип в программе. Если любые два из этих местоположений относятся к анонимным типам, которые имеют одинаковые имена полей , одинаковые типы полей и поля имеют в том же порядке , тогда эти два местоположения рассматриваются как использование того же анонимного типа .
Компилятор может затем выдавать один тип для каждого из уникальных анонимных типов, которые вы использовали в вашей сборке. Детали того, как это происходит, увлекательны (*). Я предлагаю вам покопаться в вашей сборке с помощью ILDASM, чтобы посмотреть, как мы это сделаем, если вам интересно.
Если вы создадите «один и тот же» анонимный тип - те же имена, типы и в том же порядке - в двух разных сборках , то анонимные типы не будут рассматриваться как того же типа. Анонимные типы не предназначены для использования через границы сборки.
(*) Мне.