C# 12中能否为匿名类型创建using别名?
为C# 12中的匿名类型创建using别名的可行方式
你遇到的编译错误CS1041是因为new { Name = "John", Age = 42 }是实例创建表达式,而C#的using别名指令要求的是类型引用(而非实例),所以编译器会提示需要合法的类型标识符。
虽然匿名类型没有显式名称,但借助C# 12对using别名的扩展规则,我们可以通过以下方式为其创建别名:
实现步骤
- 先声明一个匿名类型的临时变量(仅用于让编译器捕获该类型的编译时信息,可用下划线
_作为变量名避免后续误用); - 通过
typeof(临时变量)获取该匿名类型的Type,并用using别名指向这个类型。
示例代码
// 临时变量:仅用于让编译器推导匿名类型的编译时类型 var _ = new { Name = "John", Age = 42 }; // 为该匿名类型创建using别名 using AnonymousMagic = typeof(_); // 使用别名声明变量(需结合强制转换) AnonymousMagic person = (AnonymousMagic)new { Name = "Alice", Age = 30 }; // 借助模式匹配访问匿名类型的属性 if (person is { Name: string name, Age: int age }) { Console.WriteLine($"{name}, {age}"); } // 或使用dynamic类型访问属性 dynamic dynPerson = person; Console.WriteLine($"{dynPerson.Name}, {dynPerson.Age}");
注意事项
- 同一个程序集中,结构完全一致(属性名称、类型、顺序均相同)的匿名类型会被编译器视为同一个类型,因此同结构的匿名实例可以强制转换为该别名类型;
- 匿名类型是密封类且继承自
object,直接通过别名声明的变量无法直接访问属性,需通过模式匹配、反射或dynamic类型来操作属性。
内容的提问来源于stack exchange,提问作者Thomas W.
相关产品推荐
相关产品推荐

