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

时间:2011-03-23 02:32:25

标签: c# syntax c#-3.0 types anonymous

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

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 个答案:

答案 0 :(得分:8)

7.6.10.6匿名对象创建表达式

  

成员声明者可以缩写   一个简单的名称(第7.5.2节),一个成员   访问(第7.5.4节)或基本访问   (§7.6.8)。这称为投影   初始化程序,是一个简写   声明和转让给   具有相同名称的财产。   具体来说,成员声明者   表格

identifier                           expr . identifier
  

正好相当于   以下分别为:

identifer = identifier               identifier = expr . identifier
  

因此,在投影中   标识符选择的初始化程序   价值和领域或   属性值   分配。直观地,投射   初始化程序项目不只是一个值,   还有价值的名称。

(第181页)

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

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

答案 1 :(得分:2)

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

  

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

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