没有显式键的匿名类型的语法(`new {identifier}`)?

4 c# syntax types anonymous c#-3.0

这个问题中,我看到了一个匿名类型表达式,其语法不熟悉:

new { MyObjectID = g.Key, totalSum }
Run Code Online (Sandbox Code Playgroud)

起初我认为它, totalSum }是一个语法错误,因为没有指定键,但它编译并在C#3.0中工作.我在LINQPad(2.x - > C#3)中验证了这种语法:

var y = ":-)";
var q = new { Y = y, y, y.Length, };
q.Dump();
Run Code Online (Sandbox Code Playgroud)

结果:

(anon type) {
  Y = ":-)",
  y = ":-)",
  Length = 3
}
Run Code Online (Sandbox Code Playgroud)

规范中的哪个地方定义了这种语法?(答案应包括适用的参考文献和适当的摘录.)

而且,更主观(随意不回答),省略键是一个很好的语法/捷径?到目前为止,我还没有使用它,我不知道它,我不是很迷恋那个语法糖.

Jon*_*Jon 8

7.6.10.6匿名对象创建表达式

成员声明符可以缩写为简单名称(第7.5.2节),成员访问(第7.5.4节)或基本访问(第7.6.8节).这称为投影初始值设定项,是对具有相同名称的属性进行声明和赋值的简写.具体来说,是表单的成员声明者

identifier                           expr . identifier
Run Code Online (Sandbox Code Playgroud)

分别完全等同于以下内容:

identifer = identifier               identifier = expr . identifier
Run Code Online (Sandbox Code Playgroud)

因此,在投影初始化器中,标识符选择值和分配值的字段或属性.直观地说,投影初始化器不仅投影值,还投射值的名称.

(第181页)

简单来说,如果您不自己提供标识符,编译器将选择表达式"last"成员的标识符作为默认值.

至于它是好还是坏......好吧,我要避免这样做,以排除那些不了解这条捷径的人混淆的可能性.