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

C# 没有显式键(`new{identifier}`)的匿名类型语法?,c#,syntax,c#-3.0,types,anonymous,C#,Syntax,C# 3.0,Types,Anonymous,在中,我看到一个匿名类型表达式,其语法不熟悉: new { MyObjectID = g.Key, totalSum } 起初我认为,totalSum}是一个语法错误,因为没有指定键,但它在C3.0中编译并工作。我已经在LINQPad 2.x->C3中验证了此语法: var y = ":-)"; var q = new { Y = y, y, y.Length, }; q.Dump(); 结果: (anon type) { Y = ":-)", y = ":-)", Length

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

new { MyObjectID = g.Key, totalSum }
起初我认为,totalSum}是一个语法错误,因为没有指定键,但它在C3.0中编译并工作。我已经在LINQPad 2.x->C3中验证了此语法:

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. 这叫做投影 初始值设定项,是 声明和转让给 具有相同名称的属性。 特别是 表格

完全等同于 分别如下:

因此,在一个投影中 标识符选择的初始值设定项 值和字段或 属性,该属性的值是 分配。直觉上,一个投影 初始值设定项不只是一个值, 还包括值的名称

第181页

简单来说,这表示如果您自己不提供标识符,编译器将选择表达式最后一个成员的标识符作为默认值


至于是好是坏。。。好吧,我避免这样做是为了排除不知道这个快捷方式的其他人被混淆的可能性。

不确定C-3.0,但是C-4.0参考在第7.6.10.6节匿名对象创建表达式中谈到了这一点

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


我见过ASP.Net MVC中广泛使用匿名类型,例如将任意HTML属性传递给HTML助手方法。

我知道您不使用ReSharper@我不知道。我怀疑这是对这种语法的一种攻击呵呵,是的,差不多,因为它把多余的部分涂成灰色,表示它有点不对劲。
identifier                           expr . identifier
identifer = identifier               identifier = expr . identifier