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

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

new { MyObjectID = g.Key, totalSum } 

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

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

结果:

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

规范中的哪个位置定义了这种语法? (答案应包括适用的参考资料和适当的摘录。)

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

7.6.10.6匿名对象创建表达式

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

 identifier expr . identifier 

正好分别等同于以下内容:

 identifer = identifier identifier = expr . identifier 

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

(第181页)

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

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

不确定C#-3.0,但C#-4.0参考在7.6.10.6 Anonymous object creation expressions7.6.10.6 Anonymous object creation expressions讨论了这一点。

匿名对象初始值设定项声明匿名类型并返回该类型的实例。 匿名类型是直接从objectinheritance的无名类类型。 匿名类型的成员是从用于创建该类型实例的匿名对象初始值设定项推断的一系列只读属性。

我已经看到在ASP.Net MVC中广泛使用的匿名类型,例如将任意HTML属性传递给Html Helper方法。