Синтаксис анонимного типа без явных ключей (`новый {идентификатор}`)?

В этом вопросе я увидел выражение анонимного типа с незнакомым синтаксисом:

new { MyObjectID = g.Key, totalSum }

Сначала я подумал, что это (, totalSum }) синтаксическая ошибка, поскольку ключ не указан, но он компилируется и работает в C# 3.0. Я проверил этот синтаксис в LINQPad (2.x -> C#3):

var y = ":-)";
var q = new { Y = y, y, y.Length, };
q.Dump();

Результат:

(anon type) {
  Y = ":-)",
  y = ":-)",
  Length = 3
}

Где в спецификации определен этот синтаксис? (Ответы должны включать соответствующую ссылку и соответствующую выдержку.)

И, что более субъективно (не стесняйтесь не отвечать), это хороший синтаксис/сокращение для пропуска ключей? Я не использовал его до тех пор, пока не знал о нем, и я не очень очарован этим синтаксическим сахаром.


person Community    schedule 23.03.2011    source источник
comment
Я вижу, вы не используете ReSharper? ;)   -  person Kirk Woll    schedule 23.03.2011
comment
@ Кирк Уолл Я не знаю. Я подозреваю, что это вызывает истерику в этом синтаксисе? :)   -  person    schedule 23.03.2011
comment
хех, да, в значительной степени, поскольку он окрашивает избыточную часть в серый цвет, чтобы указать, что с ней что-то не так.   -  person Kirk Woll    schedule 23.03.2011


Ответы (2)


7.6.10.6 Выражения создания анонимных объектов

Декларатор члена может быть сокращен до простого имени (§7.5.2), доступа к члену (§7.5.4) или базового доступа (§7.6.8). Это называется инициализатором проекции и является сокращением для объявления и присвоения свойства с тем же именем. В частности, деклараторы членов форм

identifier                           expr . identifier

в точности эквивалентны следующим соответственно:

identifer = identifier               identifier = expr . identifier

Таким образом, в инициализаторе проекции идентификатор выбирает как значение, так и поле или свойство, которому присваивается значение. Интуитивно понятно, что инициализатор проекции проецирует не только значение, но и имя значения.

(стр. 181)

Проще говоря, это означает, что если вы сами не предоставите идентификатор, компилятор выберет идентификатор для «последнего» члена выражения по умолчанию.

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

person Jon    schedule 23.03.2011

Не уверен насчет C#-3.0, но в справочнике по C#-4.0 об этом говорится в разделе 7.6.10.6 Anonymous object creation expressions.

Инициализатор анонимного объекта объявляет анонимный тип и возвращает экземпляр этого типа. Анонимный тип — это тип безымянного класса, который наследуется непосредственно от объекта. Члены анонимного типа представляют собой последовательность свойств, доступных только для чтения, выведенных из инициализатора анонимного объекта, используемого для создания экземпляра типа.

Я видел, как анонимные типы широко используются в ASP.Net MVC для таких вещей, как передача произвольных атрибутов HTML в метод Html Helper.

person Andrew Cooper    schedule 23.03.2011