匿名类型是一个由编译器临时创建的类,它用于存储一组值。如果需要创建一个匿名类型,则可以使用 new 关键字,随后使用对象初始化器来指定该类型包含的属性和值。例如:
编译器将会把上述语句(大致)转换为:
匿名类型只能通过 var 关键字来引用,因为它并没有一个名字。
匿名类型的属性名称可以从一个本身为标识符(或者以标识符结尾)的表达式推断得到,例如:
上述代码等价于:
在同一个程序集内声明的两个匿名类型实例,如果它们的元素名称和类型是相同的,那么它们在内部就是相同的类型:
此外,匿名类型还会重写 Equals 方法来执行结构化相等比较(即数据值的比较):
而相等运算符却执行引用比较:
以下代码创建了一个匿名类型的数组:
匿名类型的对象无法通过方法有效地返回,因为将函数返回类型指定为 var 是非法的:
因此我们只得用 object 或者 dynamic 作为返回值,而每一个调用 Foo 方法的点都需要动态绑定,这种方式会丧失静态类型的安全性(以及Visual Studio的IntelliSense):
匿名类型是不可更改的,因此匿名类型的实例在创建之后无法进行改动。但是,在C# 10中,可以使用 with 关键字创建一个可变更的副本(非破坏性更改)。
匿名类型主要用于编写LINQ查询(参见第8章)。