Синтаксис анонимного типа без явных ключей (`new {identifier}`)? - PullRequest
4 голосов
/ 23 марта 2011

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

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
}

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

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

Ответы [ 2 ]

8 голосов
/ 23 марта 2011

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

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

identifier                           expr . identifier

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

identifer = identifier               identifier = expr . identifier

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

(стр. 181)

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

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

2 голосов
/ 23 марта 2011

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

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

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

...